This is the GNU Emacs Lisp Reference Manual corresponding to Emacs version 24.5.
Copyright © 1990–1996, 1998–2015 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being “GNU General Public License,” with the Front-Cover Texts being “A GNU Manual,” and with the Back-Cover Texts as in (a) below. A copy of the license is included in the section entitled “GNU Free Documentation License.”
(a) The FSF’s Back-Cover Text is: “You have the freedom to copy and modify this GNU manual. Buying copies from the FSF supports it in developing GNU and promoting software freedom.”
Published by the Free Software Foundation
51 Franklin St, Fifth Floor
Boston, MA 02110-1301
USA
ISBN 1-882114-74-4
Cover art by Etienne Suvasa.
| [ < ] | [ > ] | [Contents] | [Index] | [ ? ] |
This is the GNU Emacs Lisp Reference Manual corresponding to Emacs version 24.5.
Copyright © 1990–1996, 1998–2015 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being “GNU General Public License,” with the Front-Cover Texts being “A GNU Manual,” and with the Back-Cover Texts as in (a) below. A copy of the license is included in the section entitled “GNU Free Documentation License.”
(a) The FSF’s Back-Cover Text is: “You have the freedom to copy and modify this GNU manual. Buying copies from the FSF supports it in developing GNU and promoting software freedom.”
| 1 Introduction | Introduction and conventions used. | |
| 2 Lisp Data Types | Data types of objects in Emacs Lisp. | |
| 3 Numbers | Numbers and arithmetic functions. | |
| 4 Strings and Characters | Strings, and functions that work on them. | |
| 5 Lists | Lists, cons cells, and related functions. | |
| 6 Sequences, Arrays, and Vectors | Lists, strings and vectors are called sequences. Certain functions act on any kind of sequence. The description of vectors is here as well. | |
| 7 Hash Tables | Very fast lookup-tables. | |
| 8 Symbols | Symbols represent names, uniquely. | |
| 9 Evaluation | How Lisp expressions are evaluated. | |
| 10 Control Structures | Conditionals, loops, nonlocal exits. | |
| 11 Variables | Using symbols in programs to stand for values. | |
| 12 Functions | A function is a Lisp program that can be invoked from other functions. | |
| 13 Macros | Macros are a way to extend the Lisp language. | |
| 14 Customization Settings | Making variables and faces customizable. | |
| 15 Loading | Reading files of Lisp code into Lisp. | |
| 16 Byte Compilation | Compilation makes programs run faster. | |
| 17 Debugging Lisp Programs | Tools and tips for debugging Lisp programs. | |
| 18 Reading and Printing Lisp Objects | Converting Lisp objects to text and back. | |
| 19 Minibuffers | Using the minibuffer to read input. | |
| 20 Command Loop | How the editor command loop works, and how you can call its subroutines. | |
| 21 Keymaps | Defining the bindings from keys to commands. | |
| 22 Major and Minor Modes | Defining major and minor modes. | |
| 23 Documentation | Writing and using documentation strings. | |
| 24 Files | Accessing files. | |
| 25 Backups and Auto-Saving | Controlling how backups and auto-save files are made. | |
| 26 Buffers | Creating and using buffer objects. | |
| 27 Windows | Manipulating windows and displaying buffers. | |
| 28 Frames | Making multiple system-level windows. | |
| 29 Positions | Buffer positions and motion functions. | |
| 30 Markers | Markers represent positions and update automatically when the text is changed. | |
| 31 Text | Examining and changing text in buffers. | |
| 32 Non-ASCII Characters | Non-ASCII text in buffers and strings. | |
| 33 Searching and Matching | Searching buffers for strings or regexps. | |
| 34 Syntax Tables | The syntax table controls word and list parsing. | |
| 35 Abbrevs and Abbrev Expansion | How Abbrev mode works, and its data structures. | |
| 36 Processes | Running and communicating with subprocesses. | |
| 37 Emacs Display | Features for controlling the screen display. | |
| 38 Operating System Interface | Getting the user id, system type, environment variables, and other such things. | |
| 39 Preparing Lisp code for distribution | ||
Appendices | ||
| Appendix A Emacs 23 Antinews | Info for users downgrading to Emacs 23. | |
| Appendix B GNU Free Documentation License | The license for this documentation. | |
| Appendix C GNU General Public License | Conditions for copying and changing GNU Emacs. | |
| Appendix D Tips and Conventions | Advice and coding conventions for Emacs Lisp. | |
| Appendix E GNU Emacs Internals | Building and dumping Emacs; internal data structures. | |
| Appendix F Standard Errors | List of some standard error symbols. | |
| Appendix G Standard Keymaps | List of some standard keymaps. | |
| Appendix H Standard Hooks | List of some standard hook variables. | |
| Index | Index including concepts, functions, variables, and other terms. | |
— The Detailed Node Listing — ——————————— Here are other nodes that are subnodes of those already listed, mentioned here so you can get to them in one step: Introduction | ||
| 1.1 Caveats | Flaws and a request for help. | |
| 1.2 Lisp History | Emacs Lisp is descended from Maclisp. | |
| 1.3 Conventions | How the manual is formatted. | |
| 1.4 Version Information | Which Emacs version is running? | |
| 1.5 Acknowledgments | The authors, editors, and sponsors of this manual. | |
Conventions | ||
| 1.3.1 Some Terms | Explanation of terms we use in this manual. | |
1.3.2 nil and t | How the symbols nil and t are used.
| |
| 1.3.3 Evaluation Notation | The format we use for examples of evaluation. | |
| 1.3.4 Printing Notation | The format we use when examples print text. | |
| 1.3.5 Error Messages | The format we use for examples of errors. | |
| 1.3.6 Buffer Text Notation | The format we use for buffer contents in examples. | |
| 1.3.7 Format of Descriptions | Notation for describing functions, variables, etc. | |
Format of Descriptions | ||
| 1.3.7.1 A Sample Function Description | A description of an imaginary
function, foo.
| |
| 1.3.7.2 A Sample Variable Description | A description of an imaginary
variable, electric-future-map.
| |
Lisp Data Types | ||
| 2.1 Printed Representation and Read Syntax | How Lisp objects are represented as text. | |
| 2.2 Comments | Comments and their formatting conventions. | |
| 2.3 Programming Types | Types found in all Lisp systems. | |
| 2.4 Editing Types | Types specific to Emacs. | |
| 2.5 Read Syntax for Circular Objects | Read syntax for circular structure. | |
| 2.6 Type Predicates | Tests related to types. | |
| 2.7 Equality Predicates | Tests of equality between any two objects. | |
Programming Types | ||
| 2.3.1 Integer Type | Numbers without fractional parts. | |
| 2.3.2 Floating-Point Type | Numbers with fractional parts and with a large range. | |
| 2.3.3 Character Type | The representation of letters, numbers and control characters. | |
| 2.3.4 Symbol Type | A multi-use object that refers to a function, variable, or property list, and has a unique identity. | |
| 2.3.5 Sequence Types | Both lists and arrays are classified as sequences. | |
| 2.3.6 Cons Cell and List Types | Cons cells, and lists (which are made from cons cells). | |
| 2.3.7 Array Type | Arrays include strings and vectors. | |
| 2.3.8 String Type | An (efficient) array of characters. | |
| 2.3.9 Vector Type | One-dimensional arrays. | |
| 2.3.10 Char-Table Type | One-dimensional sparse arrays indexed by characters. | |
| 2.3.11 Bool-Vector Type | One-dimensional arrays of t or nil.
| |
| 2.3.12 Hash Table Type | Super-fast lookup tables. | |
| 2.3.13 Function Type | A piece of executable code you can call from elsewhere. | |
| 2.3.14 Macro Type | A method of expanding an expression into another expression, more fundamental but less pretty. | |
| 2.3.15 Primitive Function Type | A function written in C, callable from Lisp. | |
| 2.3.16 Byte-Code Function Type | A function written in Lisp, then compiled. | |
| 2.3.17 Autoload Type | A type used for automatically loading seldom-used functions. | |
Character Type | ||
| 2.3.3.1 Basic Char Syntax | Syntax for regular characters. | |
| 2.3.3.2 General Escape Syntax | How to specify characters by their codes. | |
| 2.3.3.3 Control-Character Syntax | Syntax for control characters. | |
| 2.3.3.4 Meta-Character Syntax | Syntax for meta-characters. | |
| 2.3.3.5 Other Character Modifier Bits | Syntax for hyper-, super-, and alt-characters. | |
Cons Cell and List Types | ||
| 2.3.6.1 Drawing Lists as Box Diagrams | Drawing pictures of lists. | |
| 2.3.6.2 Dotted Pair Notation | A general syntax for cons cells. | |
| 2.3.6.3 Association List Type | A specially constructed list. | |
String Type | ||
| 2.3.8.1 Syntax for Strings | How to specify Lisp strings. | |
| 2.3.8.2 Non-ASCII Characters in Strings | International characters in strings. | |
| 2.3.8.3 Nonprinting Characters in Strings | Literal unprintable characters in strings. | |
| 2.3.8.4 Text Properties in Strings | Strings with text properties. | |
Editing Types | ||
| 2.4.1 Buffer Type | The basic object of editing. | |
| 2.4.2 Marker Type | A position in a buffer. | |
| 2.4.3 Window Type | Buffers are displayed in windows. | |
| 2.4.4 Frame Type | Windows subdivide frames. | |
| 2.4.5 Terminal Type | A terminal device displays frames. | |
| 2.4.6 Window Configuration Type | Recording the way a frame is subdivided. | |
| 2.4.7 Frame Configuration Type | Recording the status of all frames. | |
| 2.4.8 Process Type | A subprocess of Emacs running on the underlying OS. | |
| 2.4.9 Stream Type | Receive or send characters. | |
| 2.4.10 Keymap Type | What function a keystroke invokes. | |
| 2.4.11 Overlay Type | How an overlay is represented. | |
| 2.4.12 Font Type | Fonts for displaying text. | |
Numbers | ||
| 3.1 Integer Basics | Representation and range of integers. | |
| 3.2 Floating-Point Basics | Representation and range of floating point. | |
| 3.3 Type Predicates for Numbers | Testing for numbers. | |
| 3.4 Comparison of Numbers | Equality and inequality predicates. | |
| 3.5 Numeric Conversions | Converting float to integer and vice versa. | |
| 3.6 Arithmetic Operations | How to add, subtract, multiply and divide. | |
| 3.7 Rounding Operations | Explicitly rounding floating-point numbers. | |
| 3.8 Bitwise Operations on Integers | Logical and, or, not, shifting. | |
| 3.9 Standard Mathematical Functions | Trig, exponential and logarithmic functions. | |
| 3.10 Random Numbers | Obtaining random integers, predictable or not. | |
Strings and Characters | ||
| 4.1 String and Character Basics | Basic properties of strings and characters. | |
| 4.2 Predicates for Strings | Testing whether an object is a string or char. | |
| 4.3 Creating Strings | Functions to allocate new strings. | |
| 4.4 Modifying Strings | Altering the contents of an existing string. | |
| 4.5 Comparison of Characters and Strings | Comparing characters or strings. | |
| 4.6 Conversion of Characters and Strings | Converting to and from characters and strings. | |
| 4.7 Formatting Strings | format: Emacs’s analogue of printf.
| |
| 4.8 Case Conversion in Lisp | Case conversion functions. | |
| 4.9 The Case Table | Customizing case conversion. | |
Lists | ||
| 5.1 Lists and Cons Cells | How lists are made out of cons cells. | |
| 5.2 Predicates on Lists | Is this object a list? Comparing two lists. | |
| 5.3 Accessing Elements of Lists | Extracting the pieces of a list. | |
| 5.4 Building Cons Cells and Lists | Creating list structure. | |
| 5.5 Modifying List Variables | Modifying lists stored in variables. | |
| 5.6 Modifying Existing List Structure | Storing new pieces into an existing list. | |
| 5.7 Using Lists as Sets | A list can represent a finite mathematical set. | |
| 5.8 Association Lists | A list can represent a finite relation or mapping. | |
| 5.9 Property Lists | A list of paired elements. | |
Modifying Existing List Structure | ||
5.6.1 Altering List Elements with setcar | Replacing an element in a list. | |
| 5.6.2 Altering the CDR of a List | Replacing part of the list backbone. This can be used to remove or add elements. | |
| 5.6.3 Functions that Rearrange Lists | Reordering the elements in a list; combining lists. | |
Property Lists | ||
| 5.9.1 Property Lists and Association Lists | Comparison of the advantages of property lists and association lists. | |
| 5.9.2 Property Lists Outside Symbols | Accessing property lists stored elsewhere. | |
Sequences, Arrays, and Vectors | ||
| 6.1 Sequences | Functions that accept any kind of sequence. | |
| 6.2 Arrays | Characteristics of arrays in Emacs Lisp. | |
| 6.3 Functions that Operate on Arrays | Functions specifically for arrays. | |
| 6.4 Vectors | Special characteristics of Emacs Lisp vectors. | |
| 6.5 Functions for Vectors | Functions specifically for vectors. | |
| 6.6 Char-Tables | How to work with char-tables. | |
| 6.7 Bool-vectors | How to work with bool-vectors. | |
| 6.8 Managing a Fixed-Size Ring of Objects | Managing a fixed-size ring of objects. | |
Hash Tables | ||
| 7.1 Creating Hash Tables | Functions to create hash tables. | |
| 7.2 Hash Table Access | Reading and writing the hash table contents. | |
| 7.3 Defining Hash Comparisons | Defining new comparison methods. | |
| 7.4 Other Hash Table Functions | Miscellaneous. | |
Symbols | ||
| 8.1 Symbol Components | Symbols have names, values, function definitions and property lists. | |
| 8.2 Defining Symbols | A definition says how a symbol will be used. | |
| 8.3 Creating and Interning Symbols | How symbols are kept unique. | |
| 8.4 Symbol Properties | Each symbol has a property list for recording miscellaneous information. | |
Symbol Properties | ||
| 8.4.1 Accessing Symbol Properties | Accessing symbol properties. | |
| 8.4.2 Standard Symbol Properties | Standard meanings of symbol properties. | |
Evaluation | ||
| 9.1 Introduction to Evaluation | Evaluation in the scheme of things. | |
| 9.2 Kinds of Forms | How various sorts of objects are evaluated. | |
| 9.3 Quoting | Avoiding evaluation (to put constants in the program). | |
| 9.4 Backquote | Easier construction of list structure. | |
| 9.5 Eval | How to invoke the Lisp interpreter explicitly. | |
Kinds of Forms | ||
| 9.2.1 Self-Evaluating Forms | Forms that evaluate to themselves. | |
| 9.2.2 Symbol Forms | Symbols evaluate as variables. | |
| 9.2.3 Classification of List Forms | How to distinguish various sorts of list forms. | |
| 9.2.4 Symbol Function Indirection | When a symbol appears as the car of a list, we find the real function via the symbol. | |
| 9.2.5 Evaluation of Function Forms | Forms that call functions. | |
| 9.2.6 Lisp Macro Evaluation | Forms that call macros. | |
| 9.2.7 Special Forms | "Special forms" are idiosyncratic primitives, most of them extremely important. | |
| 9.2.8 Autoloading | Functions set up to load files containing their real definitions. | |
Control Structures | ||
| 10.1 Sequencing | Evaluation in textual order. | |
| 10.2 Conditionals | if, cond, when, unless.
| |
| 10.3 Constructs for Combining Conditions | and, or, not.
| |
| 10.4 Iteration | while loops.
| |
| 10.5 Nonlocal Exits | Jumping out of a sequence. | |
Nonlocal Exits | ||
10.5.1 Explicit Nonlocal Exits: catch and throw | Nonlocal exits for the program’s own purposes. | |
10.5.2 Examples of catch and throw | Showing how such nonlocal exits can be written. | |
| 10.5.3 Errors | How errors are signaled and handled. | |
| 10.5.4 Cleaning Up from Nonlocal Exits | Arranging to run a cleanup form if an error happens. | |
Errors | ||
| 10.5.3.1 How to Signal an Error | How to report an error. | |
| 10.5.3.2 How Emacs Processes Errors | What Emacs does when you report an error. | |
| 10.5.3.3 Writing Code to Handle Errors | How you can trap errors and continue execution. | |
| 10.5.3.4 Error Symbols and Condition Names | How errors are classified for trapping them. | |
Variables | ||
| 11.1 Global Variables | Variable values that exist permanently, everywhere. | |
| 11.2 Variables that Never Change | Certain "variables" have values that never change. | |
| 11.3 Local Variables | Variable values that exist only temporarily. | |
| 11.4 When a Variable is “Void” | Symbols that lack values. | |
| 11.5 Defining Global Variables | A definition says a symbol is used as a variable. | |
| 11.6 Tips for Defining Variables Robustly | Things you should think about when you define a variable. | |
| 11.7 Accessing Variable Values | Examining values of variables whose names are known only at run time. | |
| 11.8 Setting Variable Values | Storing new values in variables. | |
| 11.9 Scoping Rules for Variable Bindings | How Lisp chooses among local and global values. | |
| 11.10 Buffer-Local Variables | Variable values in effect only in one buffer. | |
| 11.11 File Local Variables | Handling local variable lists in files. | |
| 11.12 Directory Local Variables | Local variables common to all files in a directory. | |
| 11.13 Variable Aliases | Variables that are aliases for other variables. | |
| 11.14 Variables with Restricted Values | Non-constant variables whose value can not be an arbitrary Lisp object. | |
| 11.15 Generalized Variables | Extending the concept of variables. | |
Scoping Rules for Variable Bindings | ||
| 11.9.1 Dynamic Binding | The default for binding local variables in Emacs. | |
| 11.9.2 Proper Use of Dynamic Binding | Avoiding problems with dynamic binding. | |
| 11.9.3 Lexical Binding | A different type of local variable binding. | |
| 11.9.4 Using Lexical Binding | How to enable lexical binding. | |
Buffer-Local Variables | ||
| 11.10.1 Introduction to Buffer-Local Variables | Introduction and concepts. | |
| 11.10.2 Creating and Deleting Buffer-Local Bindings | Creating and destroying buffer-local bindings. | |
| 11.10.3 The Default Value of a Buffer-Local Variable | The default value is seen in buffers that don’t have their own buffer-local values. | |
Generalized Variables | ||
11.15.1 The setf Macro | The setf macro.
| |
11.15.2 Defining new setf forms | ||
Functions | ||
| 12.1 What Is a Function? | Lisp functions vs. primitives; terminology. | |
| 12.2 Lambda Expressions | How functions are expressed as Lisp objects. | |
| 12.3 Naming a Function | A symbol can serve as the name of a function. | |
| 12.4 Defining Functions | Lisp expressions for defining functions. | |
| 12.5 Calling Functions | How to use an existing function. | |
| 12.6 Mapping Functions | Applying a function to each element of a list, etc. | |
| 12.7 Anonymous Functions | Lambda expressions are functions with no names. | |
| 12.8 Accessing Function Cell Contents | Accessing or setting the function definition of a symbol. | |
| 12.9 Closures | Functions that enclose a lexical environment. | |
| 12.11 Declaring Functions Obsolete | Declaring functions obsolete. | |
| 12.12 Inline Functions | Defining functions that the compiler will expand inline. | |
12.13 The declare Form | Adding additional information about a function. | |
| 12.14 Telling the Compiler that a Function is Defined | Telling the compiler that a function is defined. | |
| 12.15 Determining whether a Function is Safe to Call | Determining whether a function is safe to call. | |
| 12.16 Other Topics Related to Functions | Cross-references to specific Lisp primitives that have a special bearing on how functions work. | |
Lambda Expressions | ||
| 12.2.1 Components of a Lambda Expression | The parts of a lambda expression. | |
| 12.2.2 A Simple Lambda Expression Example | A simple example. | |
| 12.2.3 Other Features of Argument Lists | Details and special features of argument lists. | |
| 12.2.4 Documentation Strings of Functions | How to put documentation in a function. | |
Macros | ||
| 13.1 A Simple Example of a Macro | A basic example. | |
| 13.2 Expansion of a Macro Call | How, when and why macros are expanded. | |
| 13.3 Macros and Byte Compilation | How macros are expanded by the compiler. | |
| 13.4 Defining Macros | How to write a macro definition. | |
| 13.5 Common Problems Using Macros | Don’t evaluate the macro arguments too many times. Don’t hide the user’s variables. | |
| 13.6 Indenting Macros | Specifying how to indent macro calls. | |
Common Problems Using Macros | ||
| 13.5.1 Wrong Time | Do the work in the expansion, not in the macro. | |
| 13.5.2 Evaluating Macro Arguments Repeatedly | The expansion should evaluate each macro arg once. | |
| 13.5.3 Local Variables in Macro Expansions | Local variable bindings in the expansion require special care. | |
| 13.5.4 Evaluating Macro Arguments in Expansion | Don’t evaluate them; put them in the expansion. | |
| 13.5.5 How Many Times is the Macro Expanded? | Avoid depending on how many times expansion is done. | |
Customization Settings | ||
| 14.1 Common Item Keywords | Common keyword arguments for all kinds of customization declarations. | |
| 14.2 Defining Customization Groups | Writing customization group definitions. | |
| 14.3 Defining Customization Variables | Declaring user options. | |
| 14.4 Customization Types | Specifying the type of a user option. | |
| 14.5 Applying Customizations | Functions to apply customization settings. | |
| 14.6 Custom Themes | Writing Custom themes. | |
Customization Types | ||
| 14.4.1 Simple Types | Simple customization types: sexp, integer, etc. | |
| 14.4.2 Composite Types | Build new types from other types or data. | |
| 14.4.3 Splicing into Lists | Splice elements into list with :inline.
| |
| 14.4.4 Type Keywords | Keyword-argument pairs in a customization type. | |
| 14.4.5 Defining New Types | Give your type a name. | |
Loading | ||
| 15.1 How Programs Do Loading | The load function and others.
| |
| 15.2 Load Suffixes | Details about the suffixes that load tries.
| |
| 15.3 Library Search | Finding a library to load. | |
| 15.4 Loading Non-ASCII Characters | Non-ASCII characters in Emacs Lisp files. | |
| 15.5 Autoload | Setting up a function to autoload. | |
| 15.6 Repeated Loading | Precautions about loading a file twice. | |
| 15.7 Features | Loading a library if it isn’t already loaded. | |
| 15.8 Which File Defined a Certain Symbol | Finding which file defined a certain symbol. | |
| 15.9 Unloading | How to "unload" a library that was loaded. | |
| 15.10 Hooks for Loading | Providing code to be run when particular libraries are loaded. | |
Byte Compilation | ||
| 16.1 Performance of Byte-Compiled Code | An example of speedup from byte compilation. | |
| 16.2 Byte-Compilation Functions | Byte compilation functions. | |
| 16.3 Documentation Strings and Compilation | Dynamic loading of documentation strings. | |
| 16.4 Dynamic Loading of Individual Functions | Dynamic loading of individual functions. | |
| 16.5 Evaluation During Compilation | Code to be evaluated when you compile. | |
| 16.6 Compiler Errors | Handling compiler error messages. | |
| 16.7 Byte-Code Function Objects | The data type used for byte-compiled functions. | |
| 16.8 Disassembled Byte-Code | Disassembling byte-code; how to read byte-code. | |
Debugging Lisp Programs | ||
| 17.1 The Lisp Debugger | A debugger for the Emacs Lisp evaluator. | |
| 17.2 Edebug | A source-level Emacs Lisp debugger. | |
| 17.3 Debugging Invalid Lisp Syntax | How to find syntax errors. | |
| 17.4 Test Coverage | Ensuring you have tested all branches in your code. | |
| 17.5 Profiling | Measuring the resources that your code uses. | |
The Lisp Debugger | ||
| 17.1.1 Entering the Debugger on an Error | Entering the debugger when an error happens. | |
| 17.1.2 Debugging Infinite Loops | Stopping and debugging a program that doesn’t exit. | |
| 17.1.3 Entering the Debugger on a Function Call | Entering it when a certain function is called. | |
| 17.1.4 Explicit Entry to the Debugger | Entering it at a certain point in the program. | |
| 17.1.5 Using the Debugger | What the debugger does; what you see while in it. | |
| 17.1.6 Debugger Commands | Commands used while in the debugger. | |
| 17.1.7 Invoking the Debugger | How to call the function debug.
| |
| 17.1.8 Internals of the Debugger | Subroutines of the debugger, and global variables. | |
Edebug | ||
| 17.2.1 Using Edebug | Introduction to use of Edebug. | |
| 17.2.2 Instrumenting for Edebug | You must instrument your code in order to debug it with Edebug. | |
| 17.2.3 Edebug Execution Modes | Execution modes, stopping more or less often. | |
| 17.2.4 Jumping | Commands to jump to a specified place. | |
| 17.2.5 Miscellaneous Edebug Commands | Miscellaneous commands. | |
| 17.2.6 Breaks | Setting breakpoints to make the program stop. | |
| 17.2.7 Trapping Errors | Trapping errors with Edebug. | |
| 17.2.8 Edebug Views | Views inside and outside of Edebug. | |
| 17.2.9 Evaluation | Evaluating expressions within Edebug. | |
| 17.2.10 Evaluation List Buffer | Expressions whose values are displayed each time you enter Edebug. | |
| 17.2.11 Printing in Edebug | Customization of printing. | |
| 17.2.12 Trace Buffer | How to produce trace output in a buffer. | |
| 17.2.13 Coverage Testing | How to test evaluation coverage. | |
| 17.2.14 The Outside Context | Data that Edebug saves and restores. | |
| 17.2.15 Edebug and Macros | Specifying how to handle macro calls. | |
| 17.2.16 Edebug Options | Option variables for customizing Edebug. | |
Breaks | ||
| 17.2.6.1 Edebug Breakpoints | Breakpoints at stop points. | |
| 17.2.6.2 Global Break Condition | Breaking on an event. | |
| 17.2.6.3 Source Breakpoints | Embedding breakpoints in source code. | |
The Outside Context | ||
| 17.2.14.1 Checking Whether to Stop | When Edebug decides what to do. | |
| 17.2.14.2 Edebug Display Update | When Edebug updates the display. | |
| 17.2.14.3 Edebug Recursive Edit | When Edebug stops execution. | |
Edebug and Macros | ||
| 17.2.15.1 Instrumenting Macro Calls | The basic problem. | |
| 17.2.15.2 Specification List | How to specify complex patterns of evaluation. | |
| 17.2.15.3 Backtracking in Specifications | What Edebug does when matching fails. | |
| 17.2.15.4 Specification Examples | To help understand specifications. | |
Debugging Invalid Lisp Syntax | ||
| 17.3.1 Excess Open Parentheses | How to find a spurious open paren or missing close. | |
| 17.3.2 Excess Close Parentheses | How to find a spurious close paren or missing open. | |
Reading and Printing Lisp Objects | ||
| 18.1 Introduction to Reading and Printing | Overview of streams, reading and printing. | |
| 18.2 Input Streams | Various data types that can be used as input streams. | |
| 18.3 Input Functions | Functions to read Lisp objects from text. | |
| 18.4 Output Streams | Various data types that can be used as output streams. | |
| 18.5 Output Functions | Functions to print Lisp objects as text. | |
| 18.6 Variables Affecting Output | Variables that control what the printing functions do. | |
Minibuffers | ||
| 19.1 Introduction to Minibuffers | Basic information about minibuffers. | |
| 19.2 Reading Text Strings with the Minibuffer | How to read a straight text string. | |
| 19.3 Reading Lisp Objects with the Minibuffer | How to read a Lisp object or expression. | |
| 19.4 Minibuffer History | Recording previous minibuffer inputs so the user can reuse them. | |
| 19.5 Initial Input | Specifying initial contents for the minibuffer. | |
| 19.6 Completion | How to invoke and customize completion. | |
| 19.7 Yes-or-No Queries | Asking a question with a simple answer. | |
| 19.8 Asking Multiple Y-or-N Questions | Asking a series of similar questions. | |
| 19.9 Reading a Password | Reading a password from the terminal. | |
| 19.10 Minibuffer Commands | Commands used as key bindings in minibuffers. | |
| 19.11 Minibuffer Windows | Operating on the special minibuffer windows. | |
| 19.12 Minibuffer Contents | How such commands access the minibuffer text. | |
| 19.13 Recursive Minibuffers | Whether recursive entry to minibuffer is allowed. | |
| 19.14 Minibuffer Miscellany | Various customization hooks and variables. | |
Completion | ||
| 19.6.1 Basic Completion Functions | Low-level functions for completing strings. | |
| 19.6.2 Completion and the Minibuffer | Invoking the minibuffer with completion. | |
| 19.6.3 Minibuffer Commands that Do Completion | Minibuffer commands that do completion. | |
| 19.6.4 High-Level Completion Functions | Convenient special cases of completion (reading buffer names, variable names, etc.). | |
| 19.6.5 Reading File Names | Using completion to read file names and shell commands. | |
| 19.6.6 Completion Variables | Variables controlling completion behavior. | |
| 19.6.7 Programmed Completion | Writing your own completion function. | |
| 19.6.8 Completion in Ordinary Buffers | Completing text in ordinary buffers. | |
Command Loop | ||
| 20.1 Command Loop Overview | How the command loop reads commands. | |
| 20.2 Defining Commands | Specifying how a function should read arguments. | |
| 20.3 Interactive Call | Calling a command, so that it will read arguments. | |
| 20.4 Distinguish Interactive Calls | Making a command distinguish interactive calls. | |
| 20.5 Information from the Command Loop | Variables set by the command loop for you to examine. | |
| 20.6 Adjusting Point After Commands | Adjustment of point after a command. | |
| 20.7 Input Events | What input looks like when you read it. | |
| 20.8 Reading Input | How to read input events from the keyboard or mouse. | |
| 20.9 Special Events | Events processed immediately and individually. | |
| 20.10 Waiting for Elapsed Time or Input | Waiting for user input or elapsed time. | |
| 20.11 Quitting | How C-g works. How to catch or defer quitting. | |
| 20.12 Prefix Command Arguments | How the commands to set prefix args work. | |
| 20.13 Recursive Editing | Entering a recursive edit, and why you usually shouldn’t. | |
| 20.14 Disabling Commands | How the command loop handles disabled commands. | |
| 20.15 Command History | How the command history is set up, and how accessed. | |
| 20.16 Keyboard Macros | How keyboard macros are implemented. | |
Defining Commands | ||
20.2.1 Using interactive | General rules for interactive.
| |
20.2.2 Code Characters for interactive | The standard letter-codes for reading arguments in various ways. | |
20.2.3 Examples of Using interactive | Examples of how to read interactive arguments. | |
| 20.2.4 Select among Command Alternatives | Select among command alternatives. | |
Input Events | ||
| 20.7.1 Keyboard Events | Ordinary characters–keys with symbols on them. | |
| 20.7.2 Function Keys | Function keys–keys with names, not symbols. | |
| 20.7.3 Mouse Events | Overview of mouse events. | |
| 20.7.4 Click Events | Pushing and releasing a mouse button. | |
| 20.7.5 Drag Events | Moving the mouse before releasing the button. | |
| 20.7.6 Button-Down Events | A button was pushed and not yet released. | |
| 20.7.7 Repeat Events | Double and triple click (or drag, or down). | |
| 20.7.8 Motion Events | Just moving the mouse, not pushing a button. | |
| 20.7.9 Focus Events | Moving the mouse between frames. | |
| 20.7.10 Miscellaneous System Events | Other events the system can generate. | |
| 20.7.11 Event Examples | Examples of the lists for mouse events. | |
| 20.7.12 Classifying Events | Finding the modifier keys in an event symbol. Event types. | |
| 20.7.13 Accessing Mouse Events | Functions to extract info from mouse events. | |
| 20.7.14 Accessing Scroll Bar Events | Functions to get info from scroll bar events. | |
| 20.7.15 Putting Keyboard Events in Strings | Special considerations for putting keyboard character events in a string. | |
Reading Input | ||
| 20.8.1 Key Sequence Input | How to read one key sequence. | |
| 20.8.2 Reading One Event | How to read just one event. | |
| 20.8.3 Modifying and Translating Input Events | How Emacs modifies events as they are read. | |
| 20.8.4 Invoking the Input Method | How reading an event uses the input method. | |
| 20.8.5 Quoted Character Input | Asking the user to specify a character. | |
| 20.8.6 Miscellaneous Event Input Features | How to reread or throw away input events. | |
Keymaps | ||
| 21.1 Key Sequences | Key sequences as Lisp objects. | |
| 21.2 Keymap Basics | Basic concepts of keymaps. | |
| 21.3 Format of Keymaps | What a keymap looks like as a Lisp object. | |
| 21.4 Creating Keymaps | Functions to create and copy keymaps. | |
| 21.5 Inheritance and Keymaps | How one keymap can inherit the bindings of another keymap. | |
| 21.6 Prefix Keys | Defining a key with a keymap as its definition. | |
| 21.7 Active Keymaps | How Emacs searches the active keymaps for a key binding. | |
| 21.8 Searching the Active Keymaps | A pseudo-Lisp summary of searching active maps. | |
| 21.9 Controlling the Active Keymaps | Each buffer has a local keymap to override the standard (global) bindings. A minor mode can also override them. | |
| 21.10 Key Lookup | Finding a key’s binding in one keymap. | |
| 21.11 Functions for Key Lookup | How to request key lookup. | |
| 21.12 Changing Key Bindings | Redefining a key in a keymap. | |
| 21.13 Remapping Commands | A keymap can translate one command to another. | |
| 21.14 Keymaps for Translating Sequences of Events | Keymaps for translating sequences of events. | |
| 21.15 Commands for Binding Keys | Interactive interfaces for redefining keys. | |
| 21.16 Scanning Keymaps | Looking through all keymaps, for printing help. | |
| 21.17 Menu Keymaps | Defining a menu as a keymap. | |
Menu Keymaps | ||
| 21.17.1 Defining Menus | How to make a keymap that defines a menu. | |
| 21.17.2 Menus and the Mouse | How users actuate the menu with the mouse. | |
| 21.17.3 Menus and the Keyboard | How users actuate the menu with the keyboard. | |
| 21.17.4 Menu Example | Making a simple menu. | |
| 21.17.5 The Menu Bar | How to customize the menu bar. | |
| 21.17.6 Tool bars | A tool bar is a row of images. | |
| 21.17.7 Modifying Menus | How to add new items to a menu. | |
| 21.17.8 Easy Menu | A convenience macro for defining menus. | |
Defining Menus | ||
| 21.17.1.1 Simple Menu Items | A simple kind of menu key binding. | |
| 21.17.1.2 Extended Menu Items | More complex menu item definitions. | |
| 21.17.1.3 Menu Separators | Drawing a horizontal line through a menu. | |
| 21.17.1.4 Alias Menu Items | Using command aliases in menu items. | |
Major and Minor Modes | ||
| 22.1 Hooks | How to use hooks; how to write code that provides hooks. | |
| 22.2 Major Modes | Defining major modes. | |
| 22.3 Minor Modes | Defining minor modes. | |
| 22.4 Mode Line Format | Customizing the text that appears in the mode line. | |
| 22.5 Imenu | Providing a menu of definitions made in a buffer. | |
| 22.6 Font Lock Mode | How modes can highlight text according to syntax. | |
| 22.7 Automatic Indentation of code | How to teach Emacs to indent for a major mode. | |
| 22.8 Desktop Save Mode | How modes can have buffer state saved between Emacs sessions. | |
Hooks | ||
| 22.1.1 Running Hooks | How to run a hook. | |
| 22.1.2 Setting Hooks | How to put functions on a hook, or remove them. | |
Major Modes | ||
| 22.2.1 Major Mode Conventions | Coding conventions for keymaps, etc. | |
| 22.2.2 How Emacs Chooses a Major Mode | How Emacs chooses the major mode automatically. | |
| 22.2.3 Getting Help about a Major Mode | Finding out how to use a mode. | |
| 22.2.4 Defining Derived Modes | Defining a new major mode based on another major mode. | |
| 22.2.5 Basic Major Modes | Modes that other modes are often derived from. | |
| 22.2.6 Mode Hooks | Hooks run at the end of major mode functions. | |
| 22.2.7 Tabulated List mode | Parent mode for buffers containing tabulated data. | |
| 22.2.8 Generic Modes | Defining a simple major mode that supports comment syntax and Font Lock mode. | |
| 22.2.9 Major Mode Examples | Text mode and Lisp modes. | |
Minor Modes | ||
| 22.3.1 Conventions for Writing Minor Modes | Tips for writing a minor mode. | |
| 22.3.2 Keymaps and Minor Modes | How a minor mode can have its own keymap. | |
| 22.3.3 Defining Minor Modes | A convenient facility for defining minor modes. | |
Mode Line Format | ||
| 22.4.1 Mode Line Basics | Basic ideas of mode line control. | |
| 22.4.2 The Data Structure of the Mode Line | The data structure that controls the mode line. | |
| 22.4.3 The Top Level of Mode Line Control | The top level variable, mode-line-format. | |
| 22.4.4 Variables Used in the Mode Line | Variables used in that data structure. | |
22.4.5 %-Constructs in the Mode Line | Putting information into a mode line. | |
| 22.4.6 Properties in the Mode Line | Using text properties in the mode line. | |
| 22.4.7 Window Header Lines | Like a mode line, but at the top. | |
| 22.4.8 Emulating Mode Line Formatting | Formatting text as the mode line would. | |
Font Lock Mode | ||
| 22.6.1 Font Lock Basics | Overview of customizing Font Lock. | |
| 22.6.2 Search-based Fontification | Fontification based on regexps. | |
| 22.6.3 Customizing Search-Based Fontification | Customizing search-based fontification. | |
| 22.6.4 Other Font Lock Variables | Additional customization facilities. | |
| 22.6.5 Levels of Font Lock | Each mode can define alternative levels so that the user can select more or less. | |
| 22.6.6 Precalculated Fontification | How Lisp programs that produce the buffer contents can also specify how to fontify it. | |
| 22.6.7 Faces for Font Lock | Special faces specifically for Font Lock. | |
| 22.6.8 Syntactic Font Lock | Fontification based on syntax tables. | |
| 22.6.9 Multiline Font Lock Constructs | How to coerce Font Lock into properly highlighting multiline constructs. | |
Multiline Font Lock Constructs | ||
| 22.6.9.1 Font Lock Multiline | Marking multiline chunks with a text property. | |
| 22.6.9.2 Region to Fontify after a Buffer Change | Controlling which region gets refontified after a buffer change. | |
Automatic Indentation of code | ||
| 22.7.1 Simple Minded Indentation Engine | A simple minded indentation engine. | |
Simple Minded Indentation Engine | ||
| 22.7.1.1 SMIE Setup and Features | SMIE setup and features. | |
| 22.7.1.2 Operator Precedence Grammars | A very simple parsing technique. | |
| 22.7.1.3 Defining the Grammar of a Language | Defining the grammar of a language. | |
| 22.7.1.4 Defining Tokens | Defining tokens. | |
| 22.7.1.5 Living With a Weak Parser | Working around the parser’s limitations. | |
| 22.7.1.6 Specifying Indentation Rules | Specifying indentation rules. | |
| 22.7.1.7 Helper Functions for Indentation Rules | Helper functions for indentation rules. | |
| 22.7.1.8 Sample Indentation Rules | Sample indentation rules. | |
| 22.7.1.9 Customizing Indentation | Customizing indentation. | |
Documentation | ||
| 23.1 Documentation Basics | Where doc strings are defined and stored. | |
| 23.2 Access to Documentation Strings | How Lisp programs can access doc strings. | |
| 23.3 Substituting Key Bindings in Documentation | Substituting current key bindings. | |
| 23.4 Describing Characters for Help Messages | Making printable descriptions of non-printing characters and key sequences. | |
| 23.5 Help Functions | Subroutines used by Emacs help facilities. | |
Files | ||
| 24.1 Visiting Files | Reading files into Emacs buffers for editing. | |
| 24.2 Saving Buffers | Writing changed buffers back into files. | |
| 24.3 Reading from Files | Reading files into buffers without visiting. | |
| 24.4 Writing to Files | Writing new files from parts of buffers. | |
| 24.5 File Locks | Locking and unlocking files, to prevent simultaneous editing by two people. | |
| 24.6 Information about Files | Testing existence, accessibility, size of files. | |
| 24.7 Changing File Names and Attributes | Renaming files, changing permissions, etc. | |
| 24.8 File Names | Decomposing and expanding file names. | |
| 24.9 Contents of Directories | Getting a list of the files in a directory. | |
| 24.10 Creating, Copying and Deleting Directories | Creating and Deleting Directories. | |
| 24.11 Making Certain File Names “Magic” | Special handling for certain file names. | |
| 24.12 File Format Conversion | Conversion to and from various file formats. | |
Visiting Files | ||
| 24.1.1 Functions for Visiting Files | The usual interface functions for visiting. | |
| 24.1.2 Subroutines of Visiting | Lower-level subroutines that they use. | |
Information about Files | ||
| 24.6.1 Testing Accessibility | Is a given file readable? Writable? | |
| 24.6.2 Distinguishing Kinds of Files | Is it a directory? A symbolic link? | |
| 24.6.3 Truenames | Eliminating symbolic links from a file name. | |
| 24.6.4 File Attributes | File sizes, modification times, etc. | |
| 24.6.5 Extended File Attributes | Extended file attributes for access control. | |
| 24.6.6 Locating Files in Standard Places | How to find a file in standard places. | |
File Names | ||
| 24.8.1 File Name Components | The directory part of a file name, and the rest. | |
| 24.8.2 Absolute and Relative File Names | Some file names are relative to a current directory. | |
| 24.8.3 Directory Names | A directory’s name as a directory is different from its name as a file. | |
| 24.8.4 Functions that Expand Filenames | Converting relative file names to absolute ones. | |
| 24.8.5 Generating Unique File Names | Generating names for temporary files. | |
| 24.8.6 File Name Completion | Finding the completions for a given file name. | |
| 24.8.7 Standard File Names | If your package uses a fixed file name, how to handle various operating systems simply. | |
File Format Conversion | ||
| 24.12.1 Overview | insert-file-contents and write-region.
| |
| 24.12.2 Round-Trip Specification | Using format-alist.
| |
| 24.12.3 Piecemeal Specification | Specifying non-paired conversion. | |
Backups and Auto-Saving | ||
| 25.1 Backup Files | How backup files are made; how their names are chosen. | |
| 25.2 Auto-Saving | How auto-save files are made; how their names are chosen. | |
| 25.3 Reverting | revert-buffer, and how to customize
what it does.
| |
Backup Files | ||
| 25.1.1 Making Backup Files | How Emacs makes backup files, and when. | |
| 25.1.2 Backup by Renaming or by Copying? | Two alternatives: renaming the old file or copying it. | |
| 25.1.3 Making and Deleting Numbered Backup Files | Keeping multiple backups for each source file. | |
| 25.1.4 Naming Backup Files | How backup file names are computed; customization. | |
Buffers | ||
| 26.1 Buffer Basics | What is a buffer? | |
| 26.2 The Current Buffer | Designating a buffer as current so that primitives will access its contents. | |
| 26.3 Buffer Names | Accessing and changing buffer names. | |
| 26.4 Buffer File Name | The buffer file name indicates which file is visited. | |
| 26.5 Buffer Modification | A buffer is modified if it needs to be saved. | |
| 26.6 Buffer Modification Time | Determining whether the visited file was changed "behind Emacs’s back". | |
| 26.7 Read-Only Buffers | Modifying text is not allowed in a read-only buffer. | |
| 26.8 The Buffer List | How to look at all the existing buffers. | |
| 26.9 Creating Buffers | Functions that create buffers. | |
| 26.10 Killing Buffers | Buffers exist until explicitly killed. | |
| 26.11 Indirect Buffers | An indirect buffer shares text with some other buffer. | |
| 26.12 Swapping Text Between Two Buffers | Swapping text between two buffers. | |
| 26.13 The Buffer Gap | The gap in the buffer. | |
Windows | ||
| 27.1 Basic Concepts of Emacs Windows | Basic information on using windows. | |
| 27.2 Windows and Frames | Relating windows to the frame they appear on. | |
| 27.3 Window Sizes | Accessing a window’s size. | |
| 27.4 Resizing Windows | Changing the sizes of windows. | |
| 27.5 Splitting Windows | Splitting one window into two windows. | |
| 27.6 Deleting Windows | Deleting a window gives its space to other windows. | |
| 27.7 Recombining Windows | Preserving the frame layout when splitting and deleting windows. | |
| 27.8 Selecting Windows | The selected window is the one that you edit in. | |
| 27.9 Cyclic Ordering of Windows | Moving around the existing windows. | |
| 27.10 Buffers and Windows | Each window displays the contents of a buffer. | |
| 27.11 Switching to a Buffer in a Window | Higher-level functions for switching to a buffer. | |
| 27.12 Choosing a Window for Display | How to choose a window for displaying a buffer. | |
27.13 Action Functions for display-buffer | Subroutines for display-buffer.
| |
| 27.14 Additional Options for Displaying Buffers | Extra options affecting how buffers are displayed. | |
| 27.15 Window History | Each window remembers the buffers displayed in it. | |
| 27.16 Dedicated Windows | How to avoid displaying another buffer in a specific window. | |
| 27.17 Quitting Windows | How to restore the state prior to displaying a buffer. | |
| 27.18 Windows and Point | Each window has its own location of point. | |
| 27.19 The Window Start and End Positions | Buffer positions indicating which text is on-screen in a window. | |
| 27.20 Textual Scrolling | Moving text up and down through the window. | |
| 27.21 Vertical Fractional Scrolling | Moving the contents up and down on the window. | |
| 27.22 Horizontal Scrolling | Moving the contents sideways on the window. | |
| 27.23 Coordinates and Windows | Converting coordinates to windows. | |
| 27.24 Window Configurations | Saving and restoring the state of the screen. | |
| 27.25 Window Parameters | Associating additional information with windows. | |
| 27.26 Hooks for Window Scrolling and Changes | Hooks for scrolling, window size changes, redisplay going past a certain point, or window configuration changes. | |
Frames | ||
| 28.1 Creating Frames | Creating additional frames. | |
| 28.2 Multiple Terminals | Displaying on several different devices. | |
| 28.3 Frame Parameters | Controlling frame size, position, font, etc. | |
| 28.4 Terminal Parameters | Parameters common for all frames on terminal. | |
| 28.5 Frame Titles | Automatic updating of frame titles. | |
| 28.6 Deleting Frames | Frames last until explicitly deleted. | |
| 28.7 Finding All Frames | How to examine all existing frames. | |
| 28.8 Minibuffers and Frames | How a frame finds the minibuffer to use. | |
| 28.9 Input Focus | Specifying the selected frame. | |
| 28.10 Visibility of Frames | Frames may be visible or invisible, or icons. | |
| 28.11 Raising and Lowering Frames | Raising a frame makes it hide other windows; lowering it makes the others hide it. | |
| 28.12 Frame Configurations | Saving the state of all frames. | |
| 28.13 Mouse Tracking | Getting events that say when the mouse moves. | |
| 28.14 Mouse Position | Asking where the mouse is, or moving it. | |
| 28.15 Pop-Up Menus | Displaying a menu for the user to select from. | |
| 28.16 Dialog Boxes | Displaying a box to ask yes or no. | |
| 28.17 Pointer Shape | Specifying the shape of the mouse pointer. | |
| 28.18 Window System Selections | Transferring text to and from other X clients. | |
| 28.19 Drag and Drop | Internals of Drag-and-Drop implementation. | |
| 28.20 Color Names | Getting the definitions of color names. | |
| 28.21 Text Terminal Colors | Defining colors for text terminals. | |
| 28.22 X Resources | Getting resource values from the server. | |
| 28.23 Display Feature Testing | Determining the features of a terminal. | |
Frame Parameters | ||
| 28.3.1 Access to Frame Parameters | How to change a frame’s parameters. | |
| 28.3.2 Initial Frame Parameters | Specifying frame parameters when you make a frame. | |
| 28.3.3 Window Frame Parameters | List of frame parameters for window systems. | |
| 28.3.4 Frame Size And Position | Changing the size and position of a frame. | |
| 28.3.5 Geometry | Parsing geometry specifications. | |
Window Frame Parameters | ||
| 28.3.3.1 Basic Parameters | Parameters that are fundamental. | |
| 28.3.3.2 Position Parameters | The position of the frame on the screen. | |
| 28.3.3.3 Size Parameters | Frame’s size. | |
| 28.3.3.4 Layout Parameters | Size of parts of the frame, and enabling or disabling some parts. | |
| 28.3.3.5 Buffer Parameters | Which buffers have been or should be shown. | |
| 28.3.3.6 Window Management Parameters | Communicating with the window manager. | |
| 28.3.3.7 Cursor Parameters | Controlling the cursor appearance. | |
| 28.3.3.8 Font and Color Parameters | Fonts and colors for the frame text. | |
Positions | ||
| 29.1 Point | The special position where editing takes place. | |
| 29.2 Motion | Changing point. | |
| 29.3 Excursions | Temporary motion and buffer changes. | |
| 29.4 Narrowing | Restricting editing to a portion of the buffer. | |
Motion | ||
| 29.2.1 Motion by Characters | Moving in terms of characters. | |
| 29.2.2 Motion by Words | Moving in terms of words. | |
| 29.2.3 Motion to an End of the Buffer | Moving to the beginning or end of the buffer. | |
| 29.2.4 Motion by Text Lines | Moving in terms of lines of text. | |
| 29.2.5 Motion by Screen Lines | Moving in terms of lines as displayed. | |
| 29.2.6 Moving over Balanced Expressions | Moving by parsing lists and sexps. | |
| 29.2.7 Skipping Characters | Skipping characters belonging to a certain set. | |
Markers | ||
| 30.1 Overview of Markers | The components of a marker, and how it relocates. | |
| 30.2 Predicates on Markers | Testing whether an object is a marker. | |
| 30.3 Functions that Create Markers | Making empty markers or markers at certain places. | |
| 30.4 Information from Markers | Finding the marker’s buffer or character position. | |
| 30.5 Marker Insertion Types | Two ways a marker can relocate when you insert where it points. | |
| 30.6 Moving Marker Positions | Moving the marker to a new buffer or position. | |
| 30.7 The Mark | How "the mark" is implemented with a marker. | |
| 30.8 The Region | How to access "the region". | |
Text | ||
| 31.1 Examining Text Near Point | Examining text in the vicinity of point. | |
| 31.2 Examining Buffer Contents | Examining text in a general fashion. | |
| 31.3 Comparing Text | Comparing substrings of buffers. | |
| 31.4 Inserting Text | Adding new text to a buffer. | |
| 31.5 User-Level Insertion Commands | User-level commands to insert text. | |
| 31.6 Deleting Text | Removing text from a buffer. | |
| 31.7 User-Level Deletion Commands | User-level commands to delete text. | |
| 31.8 The Kill Ring | Where removed text sometimes is saved for later use. | |
| 31.9 Undo | Undoing changes to the text of a buffer. | |
| 31.10 Maintaining Undo Lists | How to enable and disable undo information. How to control how much information is kept. | |
| 31.11 Filling | Functions for explicit filling. | |
| 31.12 Margins for Filling | How to specify margins for filling commands. | |
| 31.13 Adaptive Fill Mode | Adaptive Fill mode chooses a fill prefix from context. | |
| 31.14 Auto Filling | How auto-fill mode is implemented to break lines. | |
| 31.15 Sorting Text | Functions for sorting parts of the buffer. | |
| 31.16 Counting Columns | Computing horizontal positions, and using them. | |
| 31.17 Indentation | Functions to insert or adjust indentation. | |
| 31.18 Case Changes | Case conversion of parts of the buffer. | |
| 31.19 Text Properties | Assigning Lisp property lists to text characters. | |
| 31.20 Substituting for a Character Code | Replacing a given character wherever it appears. | |
| 31.21 Registers | How registers are implemented. Accessing the text or position stored in a register. | |
| 31.22 Transposition of Text | Swapping two portions of a buffer. | |
| 31.23 Dealing With Compressed Data | Dealing with compressed data. | |
| 31.24 Base 64 Encoding | Conversion to or from base 64 encoding. | |
| 31.25 Checksum/Hash | Computing cryptographic hashes. | |
| 31.26 Parsing HTML and XML | ||
| 31.27 Atomic Change Groups | Installing several buffer changes "atomically". | |
| 31.28 Change Hooks | Supplying functions to be run when text is changed. | |
The Kill Ring | ||
| 31.8.1 Kill Ring Concepts | What text looks like in the kill ring. | |
| 31.8.2 Functions for Killing | Functions that kill text. | |
| 31.8.3 Yanking | How yanking is done. | |
| 31.8.4 Functions for Yanking | Commands that access the kill ring. | |
| 31.8.5 Low-Level Kill Ring | Functions and variables for kill ring access. | |
| 31.8.6 Internals of the Kill Ring | Variables that hold kill ring data. | |
Indentation | ||
| 31.17.1 Indentation Primitives | Functions used to count and insert indentation. | |
| 31.17.2 Indentation Controlled by Major Mode | Customize indentation for different modes. | |
| 31.17.3 Indenting an Entire Region | Indent all the lines in a region. | |
| 31.17.4 Indentation Relative to Previous Lines | Indent the current line based on previous lines. | |
| 31.17.5 Adjustable “Tab Stops” | Adjustable, typewriter-like tab stops. | |
| 31.17.6 Indentation-Based Motion Commands | Move to first non-blank character. | |
Text Properties | ||
| 31.19.1 Examining Text Properties | Looking at the properties of one character. | |
| 31.19.2 Changing Text Properties | Setting the properties of a range of text. | |
| 31.19.3 Text Property Search Functions | Searching for where a property changes value. | |
| 31.19.4 Properties with Special Meanings | Particular properties with special meanings. | |
| 31.19.5 Formatted Text Properties | Properties for representing formatting of text. | |
| 31.19.6 Stickiness of Text Properties | How inserted text gets properties from neighboring text. | |
| 31.19.7 Lazy Computation of Text Properties | Computing text properties in a lazy fashion only when text is examined. | |
| 31.19.8 Defining Clickable Text | Using text properties to make regions of text do something when you click on them. | |
| 31.19.9 Defining and Using Fields | The field property defines
fields within the buffer.
| |
| 31.19.10 Why Text Properties are not Intervals | Why text properties do not use Lisp-visible text intervals. | |
Non-ASCII Characters | ||
| 32.1 Text Representations | How Emacs represents text. | |
| 32.2 Disabling Multibyte Characters | Controlling whether to use multibyte characters. | |
| 32.3 Converting Text Representations | Converting unibyte to multibyte and vice versa. | |
| 32.4 Selecting a Representation | Treating a byte sequence as unibyte or multi. | |
| 32.5 Character Codes | How unibyte and multibyte relate to codes of individual characters. | |
| 32.6 Character Properties | Character attributes that define their behavior and handling. | |
| 32.7 Character Sets | The space of possible character codes is divided into various character sets. | |
| 32.8 Scanning for Character Sets | Which character sets are used in a buffer? | |
| 32.9 Translation of Characters | Translation tables are used for conversion. | |
| 32.10 Coding Systems | Coding systems are conversions for saving files. | |
| 32.11 Input Methods | Input methods allow users to enter various non-ASCII characters without special keyboards. | |
| 32.12 Locales | Interacting with the POSIX locale. | |
Coding Systems | ||
| 32.10.1 Basic Concepts of Coding Systems | Basic concepts. | |
| 32.10.2 Encoding and I/O | How file I/O functions handle coding systems. | |
| 32.10.3 Coding Systems in Lisp | Functions to operate on coding system names. | |
| 32.10.4 User-Chosen Coding Systems | Asking the user to choose a coding system. | |
| 32.10.5 Default Coding Systems | Controlling the default choices. | |
| 32.10.6 Specifying a Coding System for One Operation | Requesting a particular coding system for a single file operation. | |
| 32.10.7 Explicit Encoding and Decoding | Encoding or decoding text without doing I/O. | |
| 32.10.8 Terminal I/O Encoding | Use of encoding for terminal I/O. | |
Searching and Matching | ||
| 33.1 Searching for Strings | Search for an exact match. | |
| 33.2 Searching and Case | Case-independent or case-significant searching. | |
| 33.3 Regular Expressions | Describing classes of strings. | |
| 33.4 Regular Expression Searching | Searching for a match for a regexp. | |
| 33.5 POSIX Regular Expression Searching | Searching POSIX-style for the longest match. | |
| 33.6 The Match Data | Finding out which part of the text matched, after a string or regexp search. | |
| 33.7 Search and Replace | Commands that loop, searching and replacing. | |
| 33.8 Standard Regular Expressions Used in Editing | Useful regexps for finding sentences, pages,... | |
Regular Expressions | ||
| 33.3.1 Syntax of Regular Expressions | Rules for writing regular expressions. | |
| 33.3.2 Complex Regexp Example | Illustrates regular expression syntax. | |
| 33.3.3 Regular Expression Functions | Functions for operating on regular expressions. | |
Syntax of Regular Expressions | ||
| 33.3.1.1 Special Characters in Regular Expressions | Special characters in regular expressions. | |
| 33.3.1.2 Character Classes | Character classes used in regular expressions. | |
| 33.3.1.3 Backslash Constructs in Regular Expressions | Backslash-sequences in regular expressions. | |
The Match Data | ||
| 33.6.1 Replacing the Text that Matched | Replacing a substring that was matched. | |
| 33.6.2 Simple Match Data Access | Accessing single items of match data, such as where a particular subexpression started. | |
| 33.6.3 Accessing the Entire Match Data | Accessing the entire match data at once, as a list. | |
| 33.6.4 Saving and Restoring the Match Data | Saving and restoring the match data. | |
Syntax Tables | ||
| 34.1 Syntax Table Concepts | Basic concepts of syntax tables. | |
| 34.2 Syntax Descriptors | How characters are classified. | |
| 34.3 Syntax Table Functions | How to create, examine and alter syntax tables. | |
| 34.4 Syntax Properties | Overriding syntax with text properties. | |
| 34.5 Motion and Syntax | Moving over characters with certain syntaxes. | |
| 34.6 Parsing Expressions | Parsing balanced expressions using the syntax table. | |
| 34.7 Syntax Table Internals | How syntax table information is stored. | |
| 34.8 Categories | Another way of classifying character syntax. | |
Syntax Descriptors | ||
| 34.2.1 Table of Syntax Classes | Table of syntax classes. | |
| 34.2.2 Syntax Flags | Additional flags each character can have. | |
Parsing Expressions | ||
| 34.6.1 Motion Commands Based on Parsing | Motion functions that work by parsing. | |
| 34.6.2 Finding the Parse State for a Position | Determining the syntactic state of a position. | |
| 34.6.3 Parser State | How Emacs represents a syntactic state. | |
| 34.6.4 Low-Level Parsing | Parsing across a specified region. | |
| 34.6.5 Parameters to Control Parsing | Parameters that affect parsing. | |
Abbrevs and Abbrev Expansion | ||
| 35.1 Abbrev Tables | Creating and working with abbrev tables. | |
| 35.2 Defining Abbrevs | Specifying abbreviations and their expansions. | |
| 35.3 Saving Abbrevs in Files | Saving abbrevs in files. | |
| 35.4 Looking Up and Expanding Abbreviations | Controlling expansion; expansion subroutines. | |
| 35.5 Standard Abbrev Tables | Abbrev tables used by various major modes. | |
| 35.6 Abbrev Properties | How to read and set abbrev properties. Which properties have which effect. | |
| 35.7 Abbrev Table Properties | How to read and set abbrev table properties. Which properties have which effect. | |
Processes | ||
| 36.1 Functions that Create Subprocesses | Functions that start subprocesses. | |
| 36.2 Shell Arguments | Quoting an argument to pass it to a shell. | |
| 36.3 Creating a Synchronous Process | Details of using synchronous subprocesses. | |
| 36.4 Creating an Asynchronous Process | Starting up an asynchronous subprocess. | |
| 36.5 Deleting Processes | Eliminating an asynchronous subprocess. | |
| 36.6 Process Information | Accessing run-status and other attributes. | |
| 36.7 Sending Input to Processes | Sending input to an asynchronous subprocess. | |
| 36.8 Sending Signals to Processes | Stopping, continuing or interrupting an asynchronous subprocess. | |
| 36.9 Receiving Output from Processes | Collecting output from an asynchronous subprocess. | |
| 36.10 Sentinels: Detecting Process Status Changes | Sentinels run when process run-status changes. | |
| 36.11 Querying Before Exit | Whether to query if exiting will kill a process. | |
| 36.12 Accessing Other Processes | Accessing other processes running on your system. | |
| 36.13 Transaction Queues | Transaction-based communication with subprocesses. | |
| 36.14 Network Connections | Opening network connections. | |
| 36.15 Network Servers | Network servers let Emacs accept net connections. | |
| 36.16 Datagrams | UDP network connections. | |
| 36.17 Low-Level Network Access | Lower-level but more general function to create connections and servers. | |
| 36.18 Misc Network Facilities | Additional relevant functions for net connections. | |
| 36.19 Communicating with Serial Ports | Communicating with serial ports. | |
| 36.20 Packing and Unpacking Byte Arrays | Using bindat to pack and unpack binary data. | |
Receiving Output from Processes | ||
| 36.9.1 Process Buffers | By default, output is put in a buffer. | |
| 36.9.2 Process Filter Functions | Filter functions accept output from the process. | |
| 36.9.3 Decoding Process Output | Filters can get unibyte or multibyte strings. | |
| 36.9.4 Accepting Output from Processes | How to wait until process output arrives. | |
Low-Level Network Access | ||
36.17.1 make-network-process | Using make-network-process.
| |
| 36.17.2 Network Options | Further control over network connections. | |
| 36.17.3 Testing Availability of Network Features | Determining which network features work on the machine you are using. | |
Packing and Unpacking Byte Arrays | ||
| 36.20.1 Describing Data Layout | Describing data layout. | |
| 36.20.2 Functions to Unpack and Pack Bytes | Doing the unpacking and packing. | |
| 36.20.3 Examples of Byte Unpacking and Packing | Samples of what bindat.el can do for you! | |
Emacs Display | ||
| 37.1 Refreshing the Screen | Clearing the screen and redrawing everything on it. | |
| 37.2 Forcing Redisplay | Forcing redisplay. | |
| 37.3 Truncation | Folding or wrapping long text lines. | |
| 37.4 The Echo Area | Displaying messages at the bottom of the screen. | |
| 37.5 Reporting Warnings | Displaying warning messages for the user. | |
| 37.6 Invisible Text | Hiding part of the buffer text. | |
| 37.7 Selective Display | Hiding part of the buffer text (the old way). | |
| 37.8 Temporary Displays | Displays that go away automatically. | |
| 37.9 Overlays | Use overlays to highlight parts of the buffer. | |
| 37.10 Size of Displayed Text | How large displayed text is. | |
| 37.11 Line Height | Controlling the height of lines. | |
| 37.12 Faces | A face defines a graphics style for text characters: font, colors, etc. | |
| 37.13 Fringes | Controlling window fringes. | |
| 37.14 Scroll Bars | Controlling vertical scroll bars. | |
| 37.15 Window Dividers | Separating windows visually. | |
37.16 The display Property | Enabling special display features. | |
| 37.17 Images | Displaying images in Emacs buffers. | |
| 37.18 Buttons | Adding clickable buttons to Emacs buffers. | |
| 37.19 Abstract Display | Emacs’s Widget for Object Collections. | |
| 37.20 Blinking Parentheses | How Emacs shows the matching open parenthesis. | |
| 37.21 Character Display | How Emacs displays individual characters. | |
| 37.22 Beeping | Audible signal to the user. | |
| 37.23 Window Systems | Which window system is being used. | |
| 37.24 Bidirectional Display | Display of bidirectional scripts, such as Arabic and Farsi. | |
The Echo Area | ||
| 37.4.1 Displaying Messages in the Echo Area | Explicitly displaying text in the echo area. | |
| 37.4.2 Reporting Operation Progress | Informing user about progress of a long operation. | |
| 37.4.3 Logging Messages in *Messages* | Echo area messages are logged for the user. | |
| 37.4.4 Echo Area Customization | Controlling the echo area. | |
Reporting Warnings | ||
| 37.5.1 Warning Basics | Warnings concepts and functions to report them. | |
| 37.5.2 Warning Variables | Variables programs bind to customize their warnings. | |
| 37.5.3 Warning Options | Variables users set to control display of warnings. | |
| 37.5.4 Delayed Warnings | Deferring a warning until the end of a command. | |
Overlays | ||
| 37.9.1 Managing Overlays | Creating and moving overlays. | |
| 37.9.2 Overlay Properties | How to read and set properties. What properties do to the screen display. | |
| 37.9.3 Searching for Overlays | Searching for overlays. | |
Faces | ||
| 37.12.1 Face Attributes | What is in a face? | |
| 37.12.2 Defining Faces | How to define a face. | |
| 37.12.3 Face Attribute Functions | Functions to examine and set face attributes. | |
| 37.12.4 Displaying Faces | How Emacs combines the faces specified for a character. | |
| 37.12.5 Face Remapping | Remapping faces to alternative definitions. | |
| 37.12.6 Functions for Working with Faces | How to define and examine faces. | |
| 37.12.7 Automatic Face Assignment | Hook for automatic face assignment. | |
| 37.12.8 Basic Faces | Faces that are defined by default. | |
| 37.12.9 Font Selection | Finding the best available font for a face. | |
| 37.12.10 Looking Up Fonts | Looking up the names of available fonts and information about them. | |
| 37.12.11 Fontsets | A fontset is a collection of fonts that handle a range of character sets. | |
| 37.12.12 Low-Level Font Representation | Lisp representation for character display fonts. | |
Fringes | ||
| 37.13.1 Fringe Size and Position | Specifying where to put the window fringes. | |
| 37.13.2 Fringe Indicators | Displaying indicator icons in the window fringes. | |
| 37.13.3 Fringe Cursors | Displaying cursors in the right fringe. | |
| 37.13.4 Fringe Bitmaps | Specifying bitmaps for fringe indicators. | |
| 37.13.5 Customizing Fringe Bitmaps | Specifying your own bitmaps to use in the fringes. | |
| 37.13.6 The Overlay Arrow | Display of an arrow to indicate position. | |
The | ||
| 37.16.1 Display Specs That Replace The Text | Display specs that replace the text. | |
| 37.16.2 Specified Spaces | Displaying one space with a specified width. | |
| 37.16.3 Pixel Specification for Spaces | Specifying space width or height in pixels. | |
| 37.16.4 Other Display Specifications | Displaying an image; adjusting the height, spacing, and other properties of text. | |
| 37.16.5 Displaying in the Margins | Displaying text or images to the side of the main text. | |
Images | ||
| 37.17.1 Image Formats | Supported image formats. | |
| 37.17.2 Image Descriptors | How to specify an image for use in :display.
| |
| 37.17.3 XBM Images | Special features for XBM format. | |
| 37.17.4 XPM Images | Special features for XPM format. | |
| 37.17.5 PostScript Images | Special features for PostScript format. | |
| 37.17.6 ImageMagick Images | Special features available through ImageMagick. | |
| 37.17.7 Other Image Types | Various other formats are supported. | |
| 37.17.8 Defining Images | Convenient ways to define an image for later use. | |
| 37.17.9 Showing Images | Convenient ways to display an image once it is defined. | |
| 37.17.10 Multi-Frame Images | Some images contain more than one frame. | |
| 37.17.11 Image Cache | Internal mechanisms of image display. | |
Buttons | ||
| 37.18.1 Button Properties | Button properties with special meanings. | |
| 37.18.2 Button Types | Defining common properties for classes of buttons. | |
| 37.18.3 Making Buttons | Adding buttons to Emacs buffers. | |
| 37.18.4 Manipulating Buttons | Getting and setting properties of buttons. | |
| 37.18.5 Button Buffer Commands | Buffer-wide commands and bindings for buttons. | |
Abstract Display | ||
| 37.19.1 Abstract Display Functions | Functions in the Ewoc package. | |
| 37.19.2 Abstract Display Example | Example of using Ewoc. | |
Character Display | ||
| 37.21.1 Usual Display Conventions | The usual conventions for displaying characters. | |
| 37.21.2 Display Tables | What a display table consists of. | |
| 37.21.3 Active Display Table | How Emacs selects a display table to use. | |
| 37.21.4 Glyphs | How to define a glyph, and what glyphs mean. | |
| 37.21.5 Glyphless Character Display | How glyphless characters are drawn. | |
Operating System Interface | ||
| 38.1 Starting Up Emacs | Customizing Emacs startup processing. | |
| 38.2 Getting Out of Emacs | How exiting works (permanent or temporary). | |
| 38.3 Operating System Environment | Distinguish the name and kind of system. | |
| 38.4 User Identification | Finding the name and user id of the user. | |
| 38.5 Time of Day | Getting the current time. | |
| 38.6 Time Conversion | Converting a time from numeric form to calendrical data and vice versa. | |
| 38.7 Parsing and Formatting Times | Converting a time from numeric form to text and vice versa. | |
| 38.8 Processor Run time | Getting the run time used by Emacs. | |
| 38.9 Time Calculations | Adding, subtracting, comparing times, etc. | |
| 38.10 Timers for Delayed Execution | Setting a timer to call a function at a certain time. | |
| 38.11 Idle Timers | Setting a timer to call a function when Emacs has been idle for a certain length of time. | |
| 38.12 Terminal Input | Accessing and recording terminal input. | |
| 38.13 Terminal Output | Controlling and recording terminal output. | |
| 38.14 Sound Output | Playing sounds on the computer’s speaker. | |
| 38.15 Operating on X11 Keysyms | Operating on key symbols for X Windows. | |
| 38.16 Batch Mode | Running Emacs without terminal interaction. | |
| 38.17 Session Management | Saving and restoring state with X Session Management. | |
| 38.18 Desktop Notifications | Desktop notifications. | |
| 38.19 Notifications on File Changes | File notifications. | |
| 38.20 Dynamically Loaded Libraries | On-demand loading of support libraries. | |
Starting Up Emacs | ||
| 38.1.1 Summary: Sequence of Actions at Startup | Sequence of actions Emacs performs at startup. | |
| 38.1.2 The Init File | Details on reading the init file. | |
| 38.1.3 Terminal-Specific Initialization | How the terminal-specific Lisp file is read. | |
| 38.1.4 Command-Line Arguments | How command-line arguments are processed, and how you can customize them. | |
Getting Out of Emacs | ||
| 38.2.1 Killing Emacs | Exiting Emacs irreversibly. | |
| 38.2.2 Suspending Emacs | Exiting Emacs reversibly. | |
Terminal Input | ||
| 38.12.1 Input Modes | Options for how input is processed. | |
| 38.12.2 Recording Input | Saving histories of recent or all input events. | |
Preparing Lisp code for distribution | ||
| 39.1 Packaging Basics | The basic concepts of Emacs Lisp packages. | |
| 39.2 Simple Packages | How to package a single .el file. | |
| 39.3 Multi-file Packages | How to package multiple files. | |
| 39.4 Creating and Maintaining Package Archives | Maintaining package archives. | |
Tips and Conventions | ||
| D.1 Emacs Lisp Coding Conventions | Conventions for clean and robust programs. | |
| D.2 Key Binding Conventions | Which keys should be bound by which programs. | |
| D.3 Emacs Programming Tips | Making Emacs code fit smoothly in Emacs. | |
| D.4 Tips for Making Compiled Code Fast | Making compiled code run fast. | |
| D.5 Tips for Avoiding Compiler Warnings | Turning off compiler warnings. | |
| D.6 Tips for Documentation Strings | Writing readable documentation strings. | |
| D.7 Tips on Writing Comments | Conventions for writing comments. | |
| D.8 Conventional Headers for Emacs Libraries | Standard headers for library packages. | |
GNU Emacs Internals | ||
| E.1 Building Emacs | How the dumped Emacs is made. | |
| E.2 Pure Storage | Kludge to make preloaded Lisp functions shareable. | |
| E.3 Garbage Collection | Reclaiming space for Lisp objects no longer used. | |
| E.4 Memory Usage | Info about total size of Lisp objects made so far. | |
| E.6 Writing Emacs Primitives | Writing C code for Emacs. | |
| E.7 Object Internals | Data formats of buffers, windows, processes. | |
Object Internals | ||
| E.7.1 Buffer Internals | Components of a buffer structure. | |
| E.7.2 Window Internals | Components of a window structure. | |
| E.7.3 Process Internals | Components of a process structure. | |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GNU Emacsテキストエディターのほとんどの部分は、Emacs Lispと呼ばれるプログラミング言語で記述されています。新しいコードをEmacs Lispで記述して、このエディターの拡張としてインストールできます。しかしEmacs Lispは、単なる“拡張言語”を越えた言語であり、それ自体で完全なコンピュータープログラミング言語です。他のプログラミング言語で行なうすべてのことに、この言語を使用できます。
Emacs Lispはエディターの中で使用するようにデザインされているので、テキストのスキャンやパースのための特別な機能をもち、同様にファイル、バッファー、ディスプレー、サブプロセスを処理する機能をもちます。Emacs Lispは編集機能と密に統合されています。したがって編集コマンドはLispプログラムから簡単に呼び出せる関数であり、カスタマイズのためのパラメーターは普通のLisp変数です。
このマニュアルはEmacs Lispの完全な記述を試みます。初心者のためのEmacs Lispのイントロダクションは、Free Software Foundationからも出版されている、Bob ChassellのAn Introduction to Emacs Lisp Programmingを参照してください。このマニュアルは、Emacsを使用した編集に熟知していることを前提としています。これの基本的な情報については、The GNU Emacs Manualを参照してください。
おおまかに言うと、前の方のチャプターでは多くのプログラミング言語に対応するEmacs Lispの機能について説明し、後のチャプターではEmacs Lispに特異な機能や、特に編集に関連した機能を説明します。
これは Emacs 24.5に対応したGNU Emacs Lisp Reference Manualです。
| 1.1 Caveats | 不備な点と、助けを求める方法。 | |
| 1.2 Lisp History | Emacs LispはMaclispが由来です。 | |
| 1.3 Conventions | このマニュアルがフォーマットされた方法。 | |
| 1.4 Version Information | 実行中のEmacsのバージョンは? | |
| 1.5 Acknowledgments | このマニュアルの著者、編集者、スポンサー。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このマニュアルは幾多のドラフトを経てきました。ほとんど完璧ではありますが、不備がないとも言えません。(ほとんどの特定のモードのように)それらが副次的であるとか、まだ記述されていないという理由により、カバーされていないトピックもあります。わたしたちがそれらを完璧に扱うことはできないので、いくつかの部分は意図的に省略しました。
このマニュアルは、それがカバーしている事柄については完全に正しくあるべきあり、故に、特定の説明テキスト、チャプターやセクションの順番にたいしての批判に開かれているべきです。判りにくかったり、このマニュアルでカバーされていない何かを学ぶためにソースを見たり実験から学ぶ必要があるなら、このマニュアルはおそらくフィクスされるべきなのかもしれません。わたしたちにそれを教えてください。
このマニュアルを使用するときは、間違いを見つけたらすぐに訂正を送ってください。関数または間数グループの単純な現実例を考えたときは、ぜひそれを記述して送ってください。それが妥当ならコメントでノード名と関数名や変数名を参照してください。あなたが訂正を求めるエディションのバージョンも示してください。
M-x report-emacs-bugを使用してコメントや訂正を送ってください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lisp(LISt Processing language: リスト処理言語)は、MIT(Massachusetts Institute of Technology: マサチューセッツ工科大学)で、AI(artificial intelligence: 人工知能)の研究のために、1950年代末に最初に開発されました。Lisp言語の強力なパワーは、編集コマンドの記述のような、他の目的にも適っています。
長年の間に何ダースものLisp実装が構築されてきて、それぞれ特異な点があります。これらの多くは、1960年代にMITのProject MACで記述された、Maclispに影響を受けています。最終的に、Maclisp後裔の実装者は共同して、Common Lispと呼ばれる標準のLispシステムを開発しました。その間に、MITのGerry SussmanとGuy Steeleにより、簡潔だがとても強力なLisp方言である、Schemeが開発されました。
GNU Emacs LispはMaclispから多く、Common Lispから少し影響を受けています。Common Lispを知っている場合、多くの類似点に気がつくでしょう。しかしCommon Lispの多くの機能は、GNU Emacsが要求するメモリー量を削減するために、省略されるか単純化されています。ときには劇的に単純化がされているために、Common Lispユーザーは混乱するかもしれません。わたしたちは時折GNU Emacs LispがCommon Lispと異なるか示すでしょう。Common Lispを知らない場合、それについて心配する必要はありません。このマニュアルは自己完結しています。
cl-libライブラリーを通じて、Common Lispをかなりエミュレートできます。Overview in Common Lisp Extensionsを参照してください。
Emacs LispはSchemeの影響は受けていません。しかしGNUプロジェクトにはGuileと呼ばれるScheme実装があります。拡張が必要な新しいGNUソフトウェアーでは、Guileを使用します。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、このマニュアルで使用する表記規約を説明します。あなたはこのセクションはスキップして、後で参照したいと思うかもしれません。
| 1.3.1 Some Terms | このマニュアルで使用する用語の説明。 | |
1.3.2 nil and t | シンボルnilとtの使用方法。
| |
| 1.3.3 Evaluation Notation | 評価の例で使用するフォーマット。 | |
| 1.3.4 Printing Notation | テキストのプリント例で使用するフォーマット。 | |
| 1.3.5 Error Messages | エラー例で使用するフォーマット。 | |
| 1.3.6 Buffer Text Notation | 例のバッファー内容で使用するフォーマット。 | |
| 1.3.7 Format of Descriptions | 関数や変数などの説明にたいする表記。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このマニュアルでは、“Lispリーダー”および“Lispプリンター”という用語で、Lispのテキスト表現を実際のLispオブジェクトに変換したり、その逆を行なうLispルーチンを参照します。詳細については、Printed Representation and Read Syntaxを参照してください。あなた、つまりこのマニュアルを読んでいる人のことは“プログラマー”と考えて“あなた”と呼びます。“ユーザー”とは、あなたの記述したものも含めて、Lispプログラムを使用する人を指します。
Lispコードの例は、(list 1 2 3)のようなフォーマットです。
Examples of Lisp code are formatted like this: (list 1 2 3).
メタ構文変数(metasyntactic
variables)を表す名前や、説明されている関数の引数名前は、first-numberのような形式です。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
nil and tEmacs
Lispでは、シンボルnilには3つの異なる意味があります。1つ目は‘nil’という名前のシンボル、2つ目は論理値のfalse、3つ目は空リスト
— つまり要素が0のリストです。変数として使用した場合、nilは常に値nilをもちます。
Lispリーダーに関する限り、‘()’と‘nil’は同一です。これらは同じオブジェクト、つまりシンボルnilを意味します。このシンボルを異なる方法で記述するのは、完全に人間の読み手を意図したものです。Lispリーダーが‘()’か‘nil’のどちらかを読み取った後は、プログラマーが実際にどちらの表現で記述したかを判断する方法はありません。
このマニュアルでは、空リストを意味することを強調したいときは()と記述し、論理値のfalseを意味することを強調したいときはnilと記述します。この慣習はLispプログラムで使用してもよいでしょう。
(cons 'foo ()) ; 空リストを強調します (setq foo-flag nil) ; 論理値のfalseを強調します
論理値が期待されているコンテキストでは、非nilはtrueと判断されます。しかし論理値のtrueを表す好ましい方法はtです。trueを表す値を選択する必要があり、他に選択の根拠がない場合は、tを使用してください。シンボルtは、常に値tをもちます。
Emacs
Lispでは、nilとtは、常に自分自身を評価する、特別なシンボルです。そのためプログラムでこれらを定数として使用する場合、クォートする必要はありません。これらの値を変更使用と試みると、結果はsetting-constantエラーとなります。Variables that Never Changeを参照してください。
objectが、2つのカノニカルなブーリーン値(tまたはnil)の場合は、非nilをリターンします。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
評価することができるLisp式のことを、フォーム(form)と呼びます。フォームの評価により、常に結果としてLispオブジェクトが生成されます。このマニュアルの例では、これを‘⇒’で示します:
(car '(1 2))
⇒ 1
これは、“(car '(1 2))を評価すると1になる”と読むことができます。
フォームがマクロ呼び出しの場合、それは評価されるための新しいLispのフォームに展開されます。展開された結果は‘→’で示します。展開されたフォームを評価した結果を示すこともあれば、示さない場合もあります。
(third '(a b c))
→ (car (cdr (cdr '(a b c))))
⇒ c
1つのフォームを説明するために、同じ結果を生成する別のフォームを示すこともあります。完全に等価な2つのフォームは、‘≡’で示します。
(make-sparse-keymap) ≡ (list 'keymap)
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このマニュアルの例の多くは、それらが評価されるときにテキストをプリントします。(*scratch*バッファーのような)Lisp
Interactionバッファーでコード例を実行する場合、プリントされるテキストはそのバッファーに挿入されます。(関数eval-regionで評価するなど)他の方法でコード例を実行する場合、プリントされるテキストはエコーエリアに表示されます。
このマニュアルの例はプリントされるテキストがどこに出力されるかに関わらず、それを‘-|’で示します。フォームを評価することにより戻される値は、‘⇒’とともに後続の行で示します。
(progn (prin1 'foo) (princ "\n") (prin1 'bar))
-| foo
-| bar
⇒ bar
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
エラーをシグナルする例も、いくつかあります。これは通常、エコーエリアにエラーメッセージを表示します。エラーメッセージの行は、‘error→’で始まります。‘error→’自体は、エコーエリアに表示されないことに注意してください。
(+ 23 'x) error→ Wrong type argument: number-or-marker-p, x
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バッファー内容の変更を説明する例もあり、それらの例ではテキストの“before(以前)”と“after(以後)”のバージョンを示します。それらの例では、バッファー内容の該当する部分を、ダッシュを用いた2行の破線(バッファー名を含む)で示します。さらに、‘∗’はポイントの位置を示します(もちろんポイントのシンボルは、バッファーのテキストの一部ではなく、それはポイントが現在配されている2つの文字の間の位置を示します)。
---------- Buffer: foo ----------
This is the ∗contents of foo.
---------- Buffer: foo ----------
(insert "changed ")
⇒ nil
---------- Buffer: foo ----------
This is the changed ∗contents of foo.
---------- Buffer: foo ----------
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このマニュアルでは関数(function)、変数(variable)、コマンド(command)、ユーザーオプション(user option)、スペシャルフォーム(special form)を、統一されたフォーマットで記述します。記述の最初の行には、そのアイテムの名前と、もしあれば引数(argument)が続きます。 そのアイテムの属するカテゴリー(function、variableなど)は、行の先頭に表示します。 それ以降の行は説明行で、例を含む場合もあります。
| 1.3.7.1 A Sample Function Description | 架空の関数fooにたいする記述例。
| |
| 1.3.7.2 A Sample Variable Description | 架空の変数electric-future-mapにたいする記述例。
|
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
関数の記述では、関数の名前が最初に記述されます。同じ行に引数の名前のリストが続きます。引数の値を参照するために、引数の名前は記述の本文にも使用されます。
引数リストの中にキーワード&optionalがある場合、その後の引数が省略可能であることを示します(省略された引数のデフォルトはnilです)。その関数を呼び出すときは、&optionalを記述しないでください。
キーワード&rest(これの後には1つの引数名を続けなければなりません)は、その後に任意の引数を続けることができることを表します。&restの後に記述された引数名の値には、その関数に渡された残りのすべての引数がリストとしてセットされます。この関数を呼び出すときは、&restを記述しないでください。
以下はfooという架空の関数(function)の説明です:
関数fooはinteger2からinteger1を減じてから、その結果に残りすべての引数を加えます。integer2が与えられなかった場合、デフォルトして数値19が使用されます。
(foo 1 5 3 9)
⇒ 16
(foo 5)
⇒ 14
より一般的には、
(foo w x y…) ≡ (+ (- x w) y…)
慣例として引数の名前には、(たとえばinteger、integer1、bufferのような)期待されるタイプ名が含めます。(buffersのような)複数形のタイプは、しばしばそのタイプのオブジェクトのリストを意味します。objectのような引き数名は、それが任意のタイプであることを表します(Emacsオブジェクトタイプのリストは、Lisp Data Typesを参照してください)。他の名前をもつ引数(たとえばnew-file)は、関数に固有の引数で、関数がドキュメント文字列をもつ場合、引数のタイプはその中で説明されるべきです(Documentationを参照してください)。
&optionalや&restにより修飾される引数の、より完全な説明は、Lambda Expressionsを参照してください。
コマンド(command)、マクロ(macro)、スペシャルフォーム(special form)の説明も同じフォーマットをもちますが、‘Function’が‘Command’、‘Macro’、‘Special Form’に置き換えられます。コマンドは単にインタラクティブに呼び出すことができる関数です。マクロは関数とは違う方法(引数は評価されません)で引数を処理しますは、同じ方法で記述されます。
マクロとスペシャルフォームにたいする説明には、特定のオプション引数や繰り替えされる引数のために、より複雑な表記が使用されます。なぜなら引数リストが、より複雑な方法で別の引数に分離されるからです。‘[optional-arg]’はoptional-argがオプションであることを意味し、‘repeated-args…’は0個以上の引数を表します。カッコ(parentheses)は、複数の引数をリスト構造の追加レベルにグループ化するのに使用されます。以下は例です:
この架空のスペシャルフォームは、 bodyフォームを実行してから変数varをインクリメントするループを実装します。最初の繰り返しでは変数は値fromをもちます。以降の繰り返しでは、変数は1(incが与えられた場合はinc)増加されます。varがtoに等しい場合、bodyを実行する前にループをexitします。以下は例です:
(count-loop (i 0 10) (prin1 i) (princ " ") (prin1 (aref vector i)) (terpri))
fromとtoが省略された場合、ループを実行する前にvarにnilがバインドされ、繰り返しの先頭においてvarが非nilの場合は、ループをexitします。以下は例です:
(count-loop (done)
(if (pending)
(fixit)
(setq done t)))
このスペシャルフォームでは、引数fromおよびtoはオプションですが、両方を指定するか、両方を未指定にしなければなりません。これらの引数が与えられた場合、オプションでincも同様に指定することができます。これらの引数は、フォームのすべての残りの要素を含むbodyと区別するために、引数varとともにリストにグループ化されます。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
変数(variable)とは、オブジェクトにバインド(bind)(またはset)される名前です。変数がバインドされたオブジェクトのことを値(value)と呼びます。このような場合、その変数が値をもつ、という言い方もします。ほとんどすべての変数はユーザーがセットすることができますが、特にユーザーが変更できる特定の変数も存在し、これらはユーザーオプション(user options)と呼ばれます。通常の変数およびユーザーオプションは、関数と同様のフォーマットを使用して説明されますが、それらには引数がありません。
以下は架空の変数electric-future-mapにたいする説明です。
この変数の値はElectric Command Futureモードで使用される完全なキーマップです。このマップの関数により、まだ実行していないコマンドの編集が可能になります。
ユーザーオプションも同じフォーマットをもちますが、‘Variable’が‘User Option’に置き換えられます。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下の機能は使用しているEmacsに関する情報を提供します。
この関数は実行しているEmacsのバージョンを説明する文字列をreturnそます。バグレポートにこの文字列を含めるときに役立ちます。
(emacs-version)
⇒ "GNU Emacs 23.1 (i686-pc-linux-gnu, GTK+ Version 2.14.4)
of 2009-06-01 on cyd.mit.edu"
hereが非nilの場合、関数はテキストをバッファーのポイントの前に挿入し、nilをreturnします。この関数がインタラクティブに呼び出された場合は、同じ情報をエコーエリアに出力しますが、プレフィクス引数を与えた場合は、hereが非nilになります。
この変数の値は、Emacsがビルドされた日時を示します。値は、current-timeの値と同様の、4つの整数からなるリストです(Time of Dayを参照してください)。
emacs-build-time
⇒ (20614 63694 515336 438000)
この変数の値は実行中のEmacsのバージョンで、"23.1.1"のような文字列です。この文字列の最後の数字は、実際にはEmacsのリリースバージョン番号の一部ではなく、任意のディレクトリーにおいてEmacsがビルドされる度にインクリメントされます。"22.0.91.1"のように4つの数字から構成される値は、それがリリースではないテストバージョンであることを示します。
Emacsのメジャーバージョン番号を示す整数です。Emacs 23.1では、値は23になります。
Emacsのマイナーバージョン番号をしめす整数です。Emacs 23.1では、値は1になります。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このマニュアルは当初、Robert Krawitz、Bil Lewis、Dan LaLiberte、Richard M. Stallman、Chris Welty、GNUマニュアルグループのボランティアーにより、数年を費やして記述されました。Robert J. Chassellはこのマニュアルのレビューと編集をDefense Advanced Research Projects Agency、ARPA Order 6082のサポートのもとに手助けしてくれ、Computational Logic, IncのWarren A. Hunt, Jr.によりアレンジされました。それ以降も、追加のセクションがMiles Bader、Lars Brinkhoff、Chong Yidong、Kenichi Handa、Lute Kamstra、Juri Linkov、Glenn Morris、Thien-Thi Nguyen、Dan Nicolaescu、Martin Rudalics、Kim F. Storm、Luc Teirlinck、Eli Zaretskii、およびその他の人たちにより記述されました。
Drew Adams、Juanma Barranquero、Karl Berry、Jim Blandy、Bard Bloom、Stephane Boucher、David Boyes、Alan Carroll、Richard Davis、Lawrence R. Dodd、Peter Doornbosch、David A. Duff、Chris Eich、Beverly Erlebacher、David Eckelkamp、Ralf Fassel、Eirik Fuller、Stephen Gildea、Bob Glickstein、Eric Hanchrow、Jesper Harder、George Hartzell、Nathan Hess、Masayuki Ida、Dan Jacobson、Jak Kirman、Bob Knighten、Frederick M. Korz、Joe Lammens、Glenn M. Lewis、K. Richard Magill、Brian Marick、Roland McGrath、Stefan Monnier、Skip Montanaro、John Gardiner Myers、Thomas A. Peterson、Francesco Potortì、Friedrich Pukelsheim、Arnold D. Robbins、Raul Rockwell、Jason Rumney、Per Starbäck、Shinichirou Sugou、Kimmo Suominen、Edward Tharp、Bill Trost、Rickard Westman、Jean White、Eduard Wiebe、Matthew Wilding、Carl Witty、Dale Worley、Rusty Wright、David D. Zuhnにより訂正が提供されました。
より完全な貢献者のリストは、Emacsソースリポジトリーの関連する変更ログエントリーを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lispのオブジェクト(object)とは、Lispおプログラムにより操作されるデータです。型(type)やデータ型(data type)は、可能なオブジェクトの集合を意味します。
すべてのオブジェクトは少なくとも1つの型に属します。同じ型のオブジェクトは、同様な構造をもち、通常は同じコンテキストで使用されます。型は重複でき、オブジェクトは複数の型に属することができます。結果として、あるオブジェクトが特定の型に属するかどうかを尋ねることはできますが、オブジェクトが“その”型だけに属するかどうかは決定できません。
多くはありませんがEmacsにはいくつかの基本オブジェクト型が組み込まれています。これらの型は、他のすべての型を構成するもとであり、基本型(primitive types)と呼ばれます。すべてのオブジェクトはただ1つの基本型に属します。これらの型には、整数(integer)、浮動小数点数(float)、コンス(cons)、シンボル(symbol)、文字列(string)、ベクター(vector)、ハッシュテーブル(hash-table)、サブルーチン(subr)、バイトコード関数(byte-code function)、およびbufferのような編集に関連した特別な型(Editing Typesを参照してください)が含まれます。
基本型にはそれぞれ、オブジェクトがその型のメンバーかどうかのチェックを行なう、対応するLisp関数があります。
他の多くの言語とは異なり、Lispのオブジェクトは自己記述(self-typing)的です。オブジェクトの基本型は、オブジェクト自体に暗に含まれます。たとえばオブジェクトがベクターの場合、それを数字として扱うことはできません。Lispはベクターが数字でないことを知っているのです。
多くの言語では、プログラマーは各変数にたいしてデータ型を宣言しなければならず、コンパイラーは型を知っていますが、データの中に型はありません。Emacs Lispには、このような型宣言はありません。Lisp変数は任意の型の値をもつことができ、変数に保存した値と型を記憶します(実際には、特定の型の値だけをもつことができる少数のEmacs Lisp変数があります。Variables with Restricted Valuesを参照してください)。
このチャプターでは、GNU Emacs Lispの各標準型の意味、プリント表現(printed representation)、入力構文(read syntax)を説明します。これらのデータ型を使用する方法についての詳細は、以降のチャプターを参照してください。
| 2.1 Printed Representation and Read Syntax | Lispオブジェクトがテキストとして表現される方法。 | |
| 2.2 Comments | コメントとコメント書式の慣例。 | |
| 2.3 Programming Types | すべてのLispシステムに存在する型。 | |
| 2.4 Editing Types | Emacs固有の型。 | |
| 2.5 Read Syntax for Circular Objects | 循環構造にたいする入力構文。 | |
| 2.6 Type Predicates | 型に関連するテスト。 | |
| 2.7 Equality Predicates | 2つのオブジェクトが等しいかのテスト。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
オブジェクトのプリント表現(printed
representation)とは、オブジェクトにたいしてLispプリンター(関数prin1)が生成する出力のフォーマットです。すべてのデータ型は一意なプリント表現をもちます。オブジェクトの入力構文(read
syntax)とは、オブジェクトにたいしてLispリーダー(関数read)が受け取る入力のフォーマットです。これは一意である必要はありません。多くの種類のオブジェクトが複数の構文をもちます。Reading and Printing Lisp Objectsを参照してください。
ほとんどの場合、オブジェクトのプリント表記が、入力構文としても使用されます。しかしLispプログラム内の定数とすることに意味が無いいくつかの型には、入力構文がありません。これらのオブジェクトはハッシュ表記(hash notation)でプリントされ、‘#<’、説明的な文字列(典型的には型名にオブジェクトの名前を続けたもの)、‘>’で構成される文字列です。たとえば:
(current-buffer)
⇒ #<buffer objects.texi>
ハッシュ表気は読み取ることができないので、Lispリーダーは‘#<’に遭遇すると、常にエラーinvalid-read-syntaxをシグナルします。
他の言語では、式はテキストであり、これ以外の形式はありません。Lispでは、第一に式はLispオブジェクトであって、オブジェクトの入力構文であるテキストは副次的なものに過ぎません。たいてい、この違いを強調する必要はありませんが、このことを心に留めておかないと、たまに混乱することがあるでしょう。
インタラクティブに式を評価するとき、Lispインタープリターは最初にそれのテキスト表現を読み取り、Lispオブジェクトを生成してから、そのオブジェクトを評価します(Evaluationを参照してください)。しかし評価と読み取りは、別の処理です。読み取りによりテキストにより表現されたLispオブジェクトを読み取り、Lispオブジェクトがreturnされます。後でオブジェクトは評価されるかもしれないし、評価されないかもしれません。オブジェクトを読み取るための基本的な関数readの説明は、Input Functionsを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
コメント(comment)hqあ、プログラム中に記述されたテキストであり、そのプログラムを読む人間ためだけに存在し、プログラムの意味には何の影響ももちません。Lispでは、それが文字列や文字定数にある場合をのぞき、セミコロン(‘;’)でコメントが開始されます。行の終端までがコメントになります。Lispリーダーはコメントを破棄します。コメントはLispシステム内でプログラムを表すLispオブジェクトの一部にはなりません。
‘#@count’構成は、次のcount個の文字をスキップします。これはプログラムにより生成されたバイナリーデータを含むコメントにたいして有用です。Emacs Lisp倍とコンパイラーは、出力ファイルにこれを使用します(Byte Compilationを参照してください)。しかしソースファイル用ではありません。
コメントのフォーマットにたいする慣例は、Tips on Writing Commentsを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lispには2種類の一般的な型があります。1つはLispプログラミングに関わるもので、もう1つは編集に関わるものです。前者はさまざまな形で多くのLisp実装に存在します。後者はEmacs Lispに固有です。
| 2.3.1 Integer Type | 小数部のない数字。 | |
| 2.3.2 Floating-Point Type | 広い範囲をもつ、小数部をもつ数字。 | |
| 2.3.3 Character Type | 文字、数字、コントロール文字にたいする表現。 | |
| 2.3.4 Symbol Type | 関数、変数、プロパティーリストを参照する、一意に識別される多目的オブジェクト。 | |
| 2.3.5 Sequence Types | リストと配列はどちらもシーケンスに分類されます。 | |
| 2.3.6 Cons Cell and List Types | コンスセル、および(コンスセルにより作られる)リスト。 | |
| 2.3.7 Array Type | 配列には文字列とベクターが含まれます。 | |
| 2.3.8 String Type | (効率的な)文字の配列。 | |
| 2.3.9 Vector Type | 1次元の配列。 | |
| 2.3.10 Char-Table Type | 文字によりインデックスされる1次元の疎な配列。 | |
| 2.3.11 Bool-Vector Type | tとnilからなる、1次元の配列。
| |
| 2.3.12 Hash Table Type | とても高速な参照用のテーブル。 | |
| 2.3.13 Function Type | 他の場所から呼び出せる実行可能なコードの断片。 | |
| 2.3.14 Macro Type | より基本的だが少し見栄えの悪い、式を他の式に展開する手法。 | |
| 2.3.15 Primitive Function Type | Lispから呼び出せる、Cで記述された関数。 | |
| 2.3.16 Byte-Code Function Type | Lispで記述されてからコンパイルされた関数。 | |
| 2.3.17 Autoload Type | 頻繁に使用されない関数を自動的にロードするために使用される型。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
整数の値の範囲はマシンに依存します、最小のレンジは-536,870,912から536,870,911(30ビットでは
-2**29
から
2**29 - 1)
ですが、多くのマシンはこれより広い範囲を提供します。Emacs
Lispの数学関数は整数のオーバーフローをチェックしません。したがってEmacsのh整数が30ビットの場合、(1+
536870911)は-536,870,912になります。
整数にたいする入力構文は、(10を基数とする)数字のシーケンスで、オプションで先頭に符号、最後にピリオドがつきます。Lispインタープリターにより生成されるプリント表記には、先頭の ‘+’や、最後の‘.’はありません。
-1 ; 整数の-1. 1 ; 整数の1. 1. ; これも整数の1. +1 ; これも整数の1.
特別な例外として、数字シーケンスが有効なオブジェクトとしては大きすぎる、または小さすぎる整数を指定する場合、Lispリーダーはそれを浮動小数点数(Floating-Point Typeを参照してください)として読み取ります。たとえば、Emacsの整数が30ビットの場合、536870912は浮動小数点数の536870912.0として読み取られます。
詳細は、Numbersを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
浮動小数点数は、コンピューターにおける科学表記に相当するものです。浮動小数点数を10の指数をともなう有理数として考えることができます。正確な有効桁数と可能な指数は、マシン固有です。Emacsは値の保存にCデータ型のdoubleを使用し、内部的には10の指数ではなく、2の指数として記録します。
浮動小数点数のプリント表現には、(後に最低1つの数字をともなう)小数点と、指数のどちらか一方、または両方が必要です。たとえば‘1500.0’、‘+15e2’、‘15.0e+2’、‘+1500000e-3’、‘.15e4’は、いずれも浮動小数点数の1500を記述し、これらはすべて等価です。
詳細は、Numbersを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lispでの文字(character)は、整数以外の何者でもありません。他の言い方をすると、文字は文字コードで表現されます。たとえば文字Aは、整数の65として表現されます。
プログラムで文字を個別に使用するのは稀であり、文字のシーケンスとして構成される文字列(strings)として扱われるのがより一般的です。String Typeを参照してください。
文字列やバッファーの中の文字は、現在のところ0から4194303の範囲 — つまり22ビットに制限されています(Character Codesを参照してください)。0から127のコードはASCIIコードで、残りは非ASCIIです(Non-ASCII Charactersを参照してください)。キーボード入力を表す文字は、Control、Meta、Shiftなどの修飾キーをエンコードするために、より広い範囲をもちます。
メッセージのために、文字にたいして人間が読むことができるテキストによる説明を生成する特別な関数が存在します。Describing Characters for Help Messagesを参照してください。
| 2.3.3.1 Basic Char Syntax | 標準的な文字の構文。 | |
| 2.3.3.2 General Escape Syntax | 文字をコードにより指定する方法。 | |
| 2.3.3.3 Control-Character Syntax | コントロール文字の構文。 | |
| 2.3.3.4 Meta-Character Syntax | メタ文字の構文。 | |
| 2.3.3.5 Other Character Modifier Bits | ハイパー、スーパー、アルト文字の構文。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
文字は実際には整数なので、文字のプリント表現は10進数です。文字にたいする入力構文も利用可能ですが、Lispプログラムでこの方法により文字を記述するのは、明解なプログラミングではありません。文字にたいしては、Emacs Lispが提供する、特別な入力構文を常に使用するべきです。これらの構文フォーマットはクエスチョンマークで開始されます。
英数字にたいする通常の入力構文は、クエスチョンマークと、その後にその文字を記述します。したがって文字Aにたいしては‘?A’、文字Bにたいしては‘?B’、文字aにたいしては‘?a’となります。
たとえば:
?Q ⇒ 81 ?q ⇒ 113
句読点文字にも同じ構文を使用できますが、Lispコードを編集するためのEmacsコマンドが混乱しないように、‘\’を追加するのがよい場合がしばしばあります。たとえば開きカッコを記述するために‘?\(’と記述します。その文字が‘\’の場合、それをクォートするために、‘?\\’のように2つ目の‘\’を使用しなければなりません。
control-g、backspace、tab、newline、vertical tab、formfeed、space、return、del、escapeはそれぞれ‘?\a’、‘?\b’、‘?\t’、‘?\n’、‘?\v’、‘?\f’、‘?\s’、‘?\r’、‘?\d’、‘?\e’と表すことができます(後にダッシュのついた‘?\s’は違う意味をもちます — これは後続の文字にたいして“super”の修飾を適用します)。したがって、
?\a ⇒ 7 ; control-g, C-g ?\b ⇒ 8 ; backspace, BS, C-h ?\t ⇒ 9 ; tab, TAB, C-i ?\n ⇒ 10 ; newline, C-j ?\v ⇒ 11 ; vertical tab, C-k ?\f ⇒ 12 ; formfeed character, C-l ?\r ⇒ 13 ; carriage return, RET, C-m ?\e ⇒ 27 ; escape character, ESC, C-[ ?\s ⇒ 32 ; space character, SPC ?\\ ⇒ 92 ; backslash character, \ ?\d ⇒ 127 ; delete character, DEL
バックスラッシュが“エスケープ文字(escape character)”の役割を果たすので、これらのバックスラッシュで始まるシーケンスはエスケープシーケンス(escape sequences)とも呼ばれます。この用語法は、文字ESCとは関係ありません。‘\s’は文字定数としての使用を意図しており、文字定数の内部では、単にスペースを記述します。
エスケープという特別な意味を与えずに、任意の文字の前にバックスラッシュの使用することは許されており、害もありませんしたがって‘?\+’は‘?+’と等価です。ほとんどの文字の前にバックスラッシュを追加することに理由はありません。しかし、Lispコードを編集するEmacsコマンドが混乱するのを避けるために、文字‘()\|;'`"#.,’の前にはバックスラッシュを追加するべきです。space、tab、newline、formfeedのような空白文字の前にもバックスラッシュを追加できます。しかし、tabやspaceのような実際の空白文字のかわりに、‘\t’や‘\s’のような可読性のあるエスケープシーケンスを使用するほうが明解です(スペースを後にともなうバックスラッシュを記述する場合、後続のテキストと区別するために、文字定数の後に余分なスペースを記述するべきです)。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
特に重要なコントロール文字にたいする特別なエスケープシーケンスに加えて、Emacsは非ASCIIテキスト文字の指定に使用できる、何種類かのエスケープ構文を提供します。
最初に、文字をUnicodeの値で指定することができます。?\unnnnはUnicodeのコードポイント‘U+nnnn’の文字を表します。ここでnnnnは、(慣例により)正確に4桁の16進数です。バックスラッシュは、後続の文字がエスケープシーケンスを形成することを示し、‘u’はUnicodeエスケープシーケンスを指定します。
U+ffffより大きなコードポイントをもつUnicode文字を指定するために、若干異なる構文が存在します。?\U00nnnnnnはコードポイント‘U+nnnnnn’の文字を表します。ここでnnnnnnは6桁の16進数です。Unicode
Standardは‘U+10ffff’までのコードポイントだけを定義するので、これより大きいコードポイントを指定すると、Emacsはエラーをシグナルします。
次に、文字を16進の文字コードで指定できます。16進エスケープシーケンスは、バックスラッシュ、‘x’、および16進の文字コードにより構成されます。したがって‘?\x41’は文字A、‘?\x1’は文字C-a、?\xe0は
grave accentつきの文字‘a’を表します。
任意の数の16進数を使用できるので、この方法により任意の文字コードを表すことができます。
最後に、8進の文字コードにより文字を指定できます。8進エスケープシーケンスは、3桁までの8進数字をともなうバックスラッシュにより形成されます。したがって‘?\101’は文字A、‘?\001’は文字C-a、?\002は文字C-bを表します。この方法で指定できるのは、8進コード777までの文字だけです。
これらのエスケープシーケンスは、文字列内でも使用されます。Non-ASCII Characters in Stringsを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
他の入力構文を使用してコントロール文字を表すことができます。これは後にバックスラッシュ、カレット、対応する非コントロール文字(大文字か小文字)をともなうクエスチョンマークから構成されます。たとえば‘?\^I’と‘?\^i’はどちらも、値が9である文字C-iにたいする、有効な入力構文です。
‘^’のかわりに、‘C-’を使用することもできます。したがって‘?\C-i’は、‘?\^I’や‘?\^i’と等価です。
?\^I ⇒ 9 ?\C-I ⇒ 9
文字列やバッファーの中では、ASCIIのコントロール文字だけが許されますが、キーボード入力にたいしては‘C-’により任意の文字をコントロール文字にすることができます。これらの非ASCIIのコントロール文字にたいするコントロール文字には 非コントロール文字にたいするコードと同様に、2**26 ビットが含まれます。通常のテキスト端末には、非ASCIIコントロール文字を生成する方法がありませんが、Xおよび他のウィンドウシステムを使用することにより、簡単に生成することができます。
歴史的な理由により、EmacsはDEL文字を、?のコントロール文字として扱います:
?\^? ⇒ 127 ?\C-? ⇒ 127
結果として、Xでは有意な入力文字であるControl-?文字を、‘\C-’を使用して表現することは今のところできません。さまざまなLispファイルがこの方法によりDELを参照するため、これを変更するのは簡単ではありません。
コントロール文字の表現はファイルや文字列のなかで見ることができますが、わたしたちは‘^’構文を推奨します。キーボード入力にたいするコントロール文字に好ましいのは、‘C-’構文です。どちらを使用するかはプログラムの意味に影響しませんが、プログラムを読む人の理解を助けるでしょう。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
メタ文字(meta character)とは、META修飾キーとともにタイプされた文字です。そのような文字を表す整数には 2**27 のビットがセットされています。基本的な文字コードの広い範囲を利用可能にするために、メタや他の修飾にたいして上位ビットを使用します。
文字列では、メタ文字を示すASCII文字に、 2**7 ビットが付加されます。したがって文字列に含めることができるメタ文字のコードは1から255の範囲となり、メタ文字は通常のASCII文字のメタ修飾されたバージョンとなります。文字列内でのMETA処理の詳細については、Putting Keyboard Events in Stringsを参照してください。
メタ文字の入力構文には‘\M-’を使用します。たとえば‘?\M-A’はM-Aを意味します。8進文字コード(以下参照)や、‘\C-’、その他の文字にたいする他の構文とともに‘\M-’を使用できます。したがって、M-Aは‘?\M-A’や‘?\M-\101’と記述できます。同様に、C-M-bは‘?\M-\C-b’、‘?\C-\M-b’、‘?\M-\002’と記述することができます。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
グラフィック文字(graphic character)の大文字小文字は、文字コードで示されます。たとえばASCIIでは、文字‘a’と文字‘A’は区別されます。しかしASCIIにはコントロール文字が大文字なのか小文字なのかを表現する方法がありません。コントロール文字がタイプされたときシフトキーが使用されたかを示すために、Emacsは 2**25 のビットを使用します。この区別は、X端末や、他の特別な端末を使用しているときだけ可能です。通常のテキスト端末は、これらの違いを報告しません。シフトをあらわすビットのためのLisp構文は‘\S-’です。したがって‘?\C-\S-o’や‘?\C-\S-O’は、shifted-control-o文字を表します。
Xウィンドウシステムは文字にセットできる、他に3つ修飾ビット — hyper、super、altを定義します。これらのビットにたいする構文は、‘\H-’、‘\s-’、‘\A-’です(これらのプレフィクスでは、大文字小文字は意味があります)。したがって‘?\H-\M-\A-x’はAlt-Hyper-Meta-xを表します(‘-’が後にない‘\s’は、スペース文字を表すことに注意してください)。 数値的には、ビット値2**22はalt、2**23はsuper、2**24はhyperです。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GNU Emacs Lispでのシンボル(symbol)とは、名前をもつオブジェクトです。シンボル名は、そのシンボルのプリント表現としての役割があります。Lispの通常の使用では、1つのobarray(Creating and Interning Symbolsを参照してください)により、シンボル名は一意です — 2つのシンボルが同じ名前をもつことはありません。
シンボルは、変数、関数名としての役割や、プロパティーリストを保持する役割をもつことができます。他のすべてのLispオブジェクトから区別するためだけの役割をもつ場合もあり、データ構造内にそのようなシンボルが存在することは、確実に認識されるでしょう。与えられたコンテキストにおいて、通常はこれらのうちの1つの使用だけが意図されます。しかし3つすべての方法で、1つのシンボルを独立して使用することもできます。
名前がコロン(‘:’)で開始されるシンボルは、キーワードシンボル(keyword symbol)と呼ばれます。これらのシンボルは自動的に定数として振る舞い、通常は未知のシンボルと、いくつかの特定の候補を比較することだけに使用されます。Variables that Never Changeを参照してください。
シンボル名にはどんな文字でも含めることができます。ほとんどのシンボル名は英字、数字、‘-+=*/’などの句読点文字で記述されます。このような名前には、特別な句読点文字は必要ありません。名前が数字のように見えない限りは、名前にはどのような文字も使用できます(名前が数字のように見える場合は、名前の先頭に‘\’を記述して、強制的にシンボルとして解釈させます)。文字‘_~!@$%^&:<>{}?’はあまり使用されませんが、これらも特別な句読点文字を必要としません。他の文字も、バックスラッシュでエスケープすることにより、シンボル名に含めることができます。しかし、文字列内でのバックスラッシュの使用とは対照的に、シンボル名でのバックスラッシュは、バックスラッシュの後の1文字をエスケープするだけです。たとえば文字列内では、‘\t’はタブ文字を表します。しかしシンボル名の中では、‘\t’は英字‘t’をクォートするに過ぎません。 名前にタブ文字をもつシンボルを記述するには、(バックスラッシュを前置した)実際のタブを使用しなければなりません。しかし、そのようなことを行なうことは、めったにありません。
Common Lispに関する注意:Common Lispでは、明示的にエスケープされない限り、小文字は常に大文字に“フォールドされ(folded)”ます。Emacs Lispでは大文字と小文字は区別されます。
以下はシンボル名の例です。4番目の例の中の‘+’は、シンボルが数字として読み取られるのを防ぐために、エスケープされていることに注意してください。6番目の例では、名前の残りの部分により数字としては不正なので、エスケープの必要はありません。
foo ; ‘foo’という名前のシンボル。 FOO ; ‘foo’とは別の、‘FOO’という名前のシンボル。
1+ ; ‘1+’という名前のシンボル ; (整数の‘+1’ではありません)。
\+1 ; ‘+1’という名前のシンボル ; (とても読みやすい名前とはいえません)。
\(*\ 1\ 2\) ; ‘(* 1 2)’という名前のシンボル(悪い名前)。 +-*/_~!@$%^&=:<>{} ; ‘+-*/_~!@$%^&=:<>{}’という名前のシンボル。 ; これらの文字はエスケープする必要はありません。
シンボル名がプリント表現としての役割をもつというルールの例外として、‘##’があります。これは、名前が空文字列の、internされたシンボルのプリント表現です。さらに‘#:foo’は、internされていないfooという名前のシンボルにたいするプリント表現です(通常、Lispリーダーはすべてのシンボルをinternします。Creating and Interning Symbolsを参照してください)。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
シーケンス(sequence)とは、要素の順序セットを表現する、Lispオブジェクトです。Emacs Lispには、2種類のシーケンス — リスト(lists)と配列(arrays)があります。
リストはもっとも一般的に使用されるシーケンスです。リストは任意の型の要素を保持でき、要素の追加・削除により簡単に長さを変更できます。リストについては、次のサブセクションを参照してください。
配列は固定長のシーケンスです。配列はさらに文字列(strings)、ベクター(vectors)、文字テーブル(char-tables)、ブールベクター(bool-vectors)に細分されます。ベクターは任意の型の要素を保持できますが、文字列の要素は文字でなければならず、ブールベクターの要素はtかnilでなければなりません。文字テーブルはベクターと似ていますが、有効な文字によりインデックスづけされる点が異なります。文字列内の文字は、バッファー内の文字のようにテキストプロパティーをもつことができます(Text Propertiesを参照してください)。しかしベクターは、その要素が文字のときでも、テキストプロパティーをサポートしません。
リスト、文字列、およびその他の配列型も、重要な類似点を共有します。たとえば、それらはすべて長さlをもち、要素は0からl-1でインデックスづけされます。いくつかの関数はシーケンス関数と呼ばれ、これらは任意の種類のシーケンスを許容します。たとえば、関数lengthは、任意の種類のシーケンスの長さを報告します。Sequences, Arrays, and Vectorsを参照してください。
シーケンスは読み取りにより常に新たに作成されるので、同じシーケンスを2回読み取るのは、一般的に不可能です。シーケンスにたいする入力構文を2回読み取った場合、内容が等しい2つのシーケンスを得ます。これには1つ例外があります。空リスト()は、常に同じオブジェクトnilを表します。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
コンスセル(cons cell)は、CARスロット、CDRスロットと呼ばれる2つのスロットから構成されるオブジェクトです。各スロットは、任意のLispオブジェクトを保持できます。そのときCARスロットに保持されるオブジェクトが何であれ、わたしたちは“このコンスセルのCAR”のような言い方をします。これはCDRの場合も同様です。
リスト(list)は、コンスセルの連続するシリーズで、各コンスセルのCDRスロットは、次のコンスセル、または空リストを保持します。空リストは実際にはシンボルnilです。詳細については、Listsを参照してください。ほとんどのコンスセルはリストの一部として使用されるので、わたしたちはコンスセルにより構成される任意の構造を、リスト構造(list
structure)という用語で参照します。
Cプログラマーにたいする注意: Lispのリストはコンスセルにより構築される、リンクリスト(linked list)として機能します。Lispではポインターは暗黙的なので、わたしたちはコンスセルのスロットが、値を“保持(hold)”するのか、それとも値を“指す(point)”のかを区別しません。
コンスセルはLispの中心なので、“コンスセルではないオブジェクト”にたいする単語もあります。これらのオブジェクトはアトム(atoms)と呼ばれます。
リストにたいする入力構文とプリント表現は等しく、それは左カッコ、任意の数の要素、右カコから構成されます。以下はリストの例です:
(A 2 "A") ; 3要素のリスト。 () ; 要素がないリスト(空リスト)。 nil ; 要素がないリスト(空リスト)。 ("A ()") ; 1要素のリスト: 文字列"A ()"。 (A ()) ; 2要素のリスト:Aと空リスト。 (A nil) ; 同上 ((A B C)) ; 1要素のリスト ; (この要素は、3要素のリスト)。
読み取りにおいては、カッコの内側は、リストの要素になります。つまり、コンスセルは各要素から作成されます。コンスセルのCARスロットは要素を保持し、CDRスロットはリスト内の次のコンスセル(このコンスセルはリスト内の次の要素を保持します)を参照します。最後のコンスセルのCDRスロットは、nilを保持するようにセットされます。
CAR、CDRという名称は、Lispの歴史に由来します。オリジナルのLisp実装はIBM 704コンピューターで実行されていました。ワードを2つの部分、つまり“address”と呼ばれる部分と、“decrement”と呼ばれる部分に分割していて、その際CARはaddress部から内容を取り出す命令で、CDRはdecrement部から内容を取り出す命令でした。対照的に“cons
cells”は、これらを作成する関数consから命名されました。この関数は関数の目的、すなわちセルを作る(construction of
cells)という目的から命名されました。
| 2.3.6.1 Drawing Lists as Box Diagrams | リストを絵で書いたら。 | |
| 2.3.6.2 Dotted Pair Notation | コンスセルの一般的な構文。 | |
| 2.3.6.3 Association List Type | 特別に構成されるリスト。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
コンスセルを表現するドミノのような1対のボックスによる図により、リストを説明することができます(Lispリーダーがこのような図を読み取ることはできません。人間およびコンピューターが理解できるテキスト表記と異なり、ボックスの図は人間だけが理解できます)。この図は3要素のリスト(rose
violet buttercup)を表したものです:
--- --- --- --- --- ---
| | |--> | | |--> | | |--> nil
--- --- --- --- --- ---
| | |
| | |
--> rose --> violet --> buttercup
この図では、ボックスは任意のLispオブジェクトへの参照を保持できるスロットを表します。ボックスのペアはコンスセルを表します。矢印はLispオブジェクト(アトム、または他のコンスセル)への参照を表します。
この例では、1番目のボックスは1番目のコンスセルで、それのCARはrose(シンボル)を参照または“保持(holds)”します。2番目のボックスは1番目のコンスセルのCDRを保持し、次のボックスペア、すなわち2番目のコンスセルを参照します。2番目のコンスセルのCARはvioletで、CDRは3番目のコンスセルです。(最後の)3番目のコンスセルのCDRは、nilです。
同じリスト(rose violet buttercup)を、違うやり方で描いた別の図で表してみましょう:
--------------- ---------------- ------------------- | car | cdr | | car | cdr | | car | cdr | | rose | o-------->| violet | o-------->| buttercup | nil | | | | | | | | | | --------------- ---------------- -------------------
要素がないリストは空リスト(empty
list)で、これはシンボルnilと同じです。別の言い方をすると、nilはシンボルであり、リストでもあります。
以下は、リスト(A ())、または等価な(A nil)をボックスと矢印で描いたものです:
--- --- --- ---
| | |--> | | |--> nil
--- --- --- ---
| |
| |
--> A --> nil
以下はもっと複雑な例です。これは、1番目の要素が2等疎のリスとである、3要素のリスト((pine needles) oak
maple)を表します:
--- --- --- --- --- ---
| | |--> | | |--> | | |--> nil
--- --- --- --- --- ---
| | |
| | |
| --> oak --> maple
|
| --- --- --- ---
--> | | |--> | | |--> nil
--- --- --- ---
| |
| |
--> pine --> needles
同じリストを2番目のボックス表記で表すと、以下のようになります:
-------------- -------------- --------------
| car | cdr | | car | cdr | | car | cdr |
| o | o------->| oak | o------->| maple | nil |
| | | | | | | | | |
-- | --------- -------------- --------------
|
|
| -------------- ----------------
| | car | cdr | | car | cdr |
------>| pine | o------->| needles | nil |
| | | | | |
-------------- ----------------
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ドットペア表記(dotted pair
notation)はCARとCDRが明示的に表されたコンスセルにたいする、一般的な構文です。この構文では、(a
.
b)は、CARがオブジェクトaで、CDRがオブジェクトbという意味になります。CDRがリスとである必要がないので、ドットペア表記は、より一般的なリスト構文です。しかしキスと構文が機能するでような場合には、より扱いにくくなります。ドットペア表記では、リスト‘(1
2 3)’は、‘(1 . (2 . (3
.
nil)))’と記述されます。nilで終端されたリストにたいしては、どちらの表記法も使用できますが、リスト表記の方が、通常は明解で便利です。リストをプリントする場合、コンスセルのCDRがリスとでないときだけ、ドットペア表記が使用されます。
以下はボックスを使用してドットペア表記を表した例です。この例はペア(rose . violet)を表します。
--- ---
| | |--> violet
--- ---
|
|
--> rose
最後のCDRが非nilのコンスセルのチェーンを表すために、ドットペア表記とリスト表記を組み合わせることができます。リストの最後の要素の後にドットを記述して、その後に最後のコンスセルのCDRを記述します。たとえば、(rose
violet . buttercup)は、(rose . (violet
. buttercup))と等価です。オブジェクトは以下のようになります:
--- --- --- ---
| | |--> | | |--> buttercup
--- --- --- ---
| |
| |
--> rose --> violet
構文(rose . violet .
buttercup)は無効です。なぜならこれが意味することは何もないからです。何かあるにしても、violetのためにCDRがすでに使用されているコンスセルのCDRにbuttercupを置く、ということになります。
リスト(rose violet)は(rose . (violet))と等価であり、以下のようになります:
--- --- --- ---
| | |--> | | |--> nil
--- --- --- ---
| |
| |
--> rose --> violet
同様に3要素のリスト(rose violet buttercup)は、(rose . (violet
. (buttercup)))と等価です。
これは以下のようになります:
--- --- --- --- --- ---
| | |--> | | |--> | | |--> nil
--- --- --- --- --- ---
| | |
| | |
--> rose --> violet --> buttercup
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
連想リスト(association list)またはalistは、要素がコンスセルであるように特別に構成されたリストです。各要素においては、CARがキー(key)で、CDRが連想値(associated value)であると考えます(連想値がCDRのCARに保存される場合もあります)。リストの先頭に連想値を追加したり削除するのが簡単なので、連想リストはスタック(stack)にしばしば使用されます。
たとえば、
(setq alist-of-colors
'((rose . red) (lily . white) (buttercup . yellow)))
これは変数alist-of-colorsに3葉疎のalistをセットします。最初の要素では、roseがキーで、redが値になります。
alistと、alistに関数についての詳細な説明は、Association Listsを参照してください。テーブルを照合する、(多くのキーの操作を、より速く行なう)他の手段については、Hash Tablesを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
配列(array)は、他のLispオブジェクトを保持または参照する、任意の数のスロットから構成され、メモリーの連続ブロックに配列されます。配列の任意の要素へのアクセス時間は、大体同じです。対照的に、リストの要素にたいするアクセスは、リスト内でのその要素の位置に比例した時間を要します(リストの最後の要素にアクセスするには、リストの最初の要素にアクセスするより、長い時間を要します)。
Emacsは文字列(strings)、ベクター(vectors)、ブールベクター(bool-vectors)、文字テーブル(char-tables)という、4種の配列を定義します。
文字列は文字の配列で、ベクターは任意のオブジェクトの配列です。ブールベクターはtかnilだけを保持できます。この種の配列は、もっとも大きい整数までの、任意の長さをもつことができます。文字テーブルは、任意の有効な文字コードによりインデックスづけされる疎な配列で、任意のオブジェクトを保持することができます。
配列の最初の要素はインデックス0、2番目の要素はインデックス1、...となります。これは0基準zero-originのインデックスづけと呼ばれます。たとえば、4要素の配列は、インデックス0、1、2、3をもちます。利用できる最大のインデックス値は、配列の長さより1小さくなります。1度配列が作成されると、長さは固定されます。
Emacs Lispのすべての配列は、1次元です(他のほとんどのプログラミング言語は多次元配列をサポートしますが、これらは必須ではありません。ネストされた1次元配列により同じ効果を得ることができます)。各種の配列のは、独自の入力構文をもちます。詳細は以降のセクションを参照してください。
配列型はシーケンス型のサブセットであり、文字列型、ベクター型、ブールベクター型、文字テーブル型が含まれます。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
文字列(string)とは、文字の配列です。Emacsがテキストエディターであることから予想できるように、文字列は、たとえばLispシンボルの名前、ユーザーへのメッセージ、バッファーから抽出されたテキストの表現など、多くの目的のために使用されます。Lispの文字列は定数です。文字列を評価すると、それと同じ文字列がreturnされます。
文字列を操作する関数については、Strings and Charactersを参照してください。
| 2.3.8.1 Syntax for Strings | Lisp文字列を指定する方法。 | |
| 2.3.8.2 Non-ASCII Characters in Strings | 文字列内の国際化文字。 | |
| 2.3.8.3 Nonprinting Characters in Strings | 文字列内の印刷不可能なリテラル文字。 | |
| 2.3.8.4 Text Properties in Strings | テキストプロパティーをともなう文字列。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
文字列にたいする入力構文は、"like
this"のように、ダブルクォート、任意個の文字、もう1つのダブルクォートから構成されます。文字列内にダブルクォートを含める場合は、それの前にバックスラッシュを記述します。したがって、"\""は1つのダブルクォート文字だけを含む文字列です。同様に、バックスラッシュを含める場合は、"this
\\ is a single embedded backslash"のように、それの前にもう1つのバックスラッシュを記述します。
文字列にたいする入力構文では、改行(newline)は特別ではありません。ダブルクォートの間に改行を記述すれば、その改行は文字列内の文字となります。しかしエスケープされた改行 — 前に‘\’をともなう改行 —は文字列の一部とはなりません。同様に、エスケープされたスペース‘\ ’も無視されます。
"It is useful to include newlines
in documentation strings,
but the newline is \
ignored if escaped."
⇒ "It is useful to include newlines
in documentation strings,
but the newline is ignored if escaped."
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacdの文字列内の非ASCII文字にたいしては、2つのテキスト表現 — マルチバイト(multibyte)とユニバイト(unibyte)があります(Text Representationsを参照してください)。大まかに言うと、ユニバイト文字列にはraw(生)バイトが保存され、マルチバイト文字列には人間が読めるテキストが保存されます。ユニバイト文字列内の各文字はバイトであり、値は0から255となります。対照的に、マルチバイト文字列内の各文字は、0から4194303の値をもつかもしれません(Character Typeを参照してください)。両方とも、127より上の文字は非ASCIIです。
文字をリテラルとして記述することにより、文字列に非ASCII文字を含めることができます。マルチバイトのバッファーや文字列、あるいはマルチバイトとしてvisitされたファイル等の、マルチバイトのソースから文字列定数を読み込む場合、Emacsは非ASCII文字をマルチバイト文字として読み取り、その文字列を自動的にマルチバイト文字列にします。ユニバイトのソースから文字列定数を読み込む場合、Emacsは非ASCII文字をユニバイト文字として読み取り、その文字列を湯にバイト文字列にします。
マルチバイト文字列内にリテラルとして文字を記述するかわりに、エスケープシーケンスを使用して文字コードとして記述できます。エスケープシーケンスについての詳細は、General Escape Syntaxを参照してください。
文字列定数内でUnicodeスタイルのエスケープシーケンス‘\uNNNN’または‘\U00NNNNNN’を使用する場合、(たとえASCII文字の場合でも)Emacsは自動的に文字列をマルチバイトとみなします。
文字列定数内で、16進エスケープシーケンス(‘\xn’)、および8進エスケープシーケンス(‘\n’)を使用することもできます。しかし注意してください: 文字列定数が16進または8進のエスケープシーケンスを含み、それらのエスケープシーケンスすべてがユニバイト文字(256より小)を指定していて、その文字列内に他にリテラルの非ASCII文字またはUnicodeスタイルのエスケープシーケンスが存在しない場合、Emacsは自動的に文字列をユニバイト文字列とみなします。つまり文字列内のすべての非ASCII文字は8ビットのrawバイトとみなされます。
16進および8進のエスケープシーケンスではエスケープされた文字コードは可変個の数字を含むかもしれないので、それに続く文字で、16進および8進として有効ではない最初の文字は、エスケープシーケンスを終了させます。文字列内の次の文字が16進または8進として解釈できる文字の場合は、‘\ ’(バックスラッシュとスペース)を記述して、エスケープシーケンスを終了できます。たとえば‘\xe0\ ’はgrave accentつきの‘a’という、1文字を表します。文字列内の‘\ ’は、バックスラッシュー改行と同様です。これは文字列内の文字とはなりませんが、先行する16進エスケープを終了します。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
リテラル文字と同様に、文字列定数内でバックスラッシュによるエスケープシーケンスを使用できます(ただし文字定数を開始するクエスチョンマークは使用しません)。たとえば、非プリント文字のタブとC-aを含む文字列は、"\t,
\C-a"のように、それらの間にカンマとスペースを記述します。文字にたいする入力構文の説明は、Character Typeを参照してください。
しかし、バックスラッシュによるエスケープシーケンスとともに記述できるすべての文字が、文字列内で有効というわけではありません。文字列が保持できるコントロール文字は、ASCIIコントロール文字だけです。ASCIIコントロール文字では、文字列の大文字小文字は区別されません。
正確に言うと、文字列はメタ文字を保持できません。しかし文字列がキーシーケンスとして使用される場合、文字列内でメタで修飾されたASCII文字を表現するための方法を提供する、特別な慣習があります。文字列定数内でメタ文字を示すために‘\M-’構文を使用した場合、これは文字列内の文字の
2**7
のビットをセットします。その文字列がdefine-keyまたはlookup-keyで使用される場合、この数字コードは等価なメタ文字に変換されます。Character Typeを参照してください。
文字列はhyper、super、altで修飾された文字を保持できません。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
文字列は、その文字自身に加えて、文字のプロパティーも保持することができます。これにより、特別なことをしなくても、文字列とバッファーとの間でテキストをコピーするプログラムが、テキストプロパティーをコピーすることが可能になります。テキストプロパティーが何を意味するかについての説明は、Text Propertiesを参照してください。テキストプロパティーをもつ文字列は、特別な入力構文とプリント構文を使用します。
#("characters" property-data...)
ここでproperty-dataは3個でグループ化された、0個以上の要素から構成されます:
beg end plist
要素begおよびendは整数で、文字列内のインデックスの範囲を指定します。plistはその範囲にたいするプロパティーリストです。たとえば、
#("foo bar" 0 3 (face bold) 3 4 nil 4 7 (face italic))
これはテキスト内容が‘foo
bar’で、最初の3文字はfaceプロパティーに値boldをもち、最後の3文字はfaceプロパティーに値italicをもつことを表します。(4番目の文字にはテキストプロパティーはないので、プロパティーリストはnilです。実際には、範囲の中の指定されていない文字はデフォルトではプロパティーをもたないので、範囲のプロパティーリストをnilと指定する必要ありません)。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ベクター(vector)は、任意の型の要素からなる1次元の配列です。ベクター内の任意の要素へのアクセスに要す時間は、一定です(リストの場合、要素へのアクセスに要す時間は、リストの先頭からその要素までの距離に比例します)。
ベクターのプリント表現は、左角カッコ(left square bracket)、要素、右角カッコ(right square bracket)から構成されます。これは入力構文でもあります。数字や文字列と同様に、ベクターは評価において定数と判断されます。
[1 "two" (three)] ; 3要素のベクター。
⇒ [1 "two" (three)]
ベクターに作用する関数については、Vectorsを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
文字テーブル(char-table)は、任意の型の要素をもつ1次元の配列で、文字コードによりインデックスづけされます。文字テーブルは、文字コードに情報を割り当てることを必要とする多くの処理を簡単にするための、特別な追加の機能をもちます — たとえば、文字テーブルは、継承するための親、デフォルト値、特別な目的のために使用する少数の余分なスロットをもつことができます。文字テーブルは、文字セット全体にたいして1つの値を指定することもできます。
文字テーブルのプリント表現はベクターと似ていますが、最初に余分な‘#^’があります1。
文字テーブルを操作する特別な関数については、Char-Tablesを参照してください。文字テーブルの使用には以下が含まれます:
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ブールベクター(bool-vector)は、要素がtかnilでなければならない、1次元の配列です。
ブールベクターのプリント表現は文字列と似ていますが、後に長さを記述した‘#&’で始まります。これに続く文字列定数は、ビットマップとして実際に内容を指定するブールベクターです
—
文字列定数内のそれぞれの“文字”は8ビットを含み、これはブールベクターの次の8要素を指定します(1はt、0はnilです)。文字の最下位ビットブールベクターの最下位のインデックスに対応します。
(make-bool-vector 3 t)
⇒ #&3"^G"
(make-bool-vector 3 nil)
⇒ #&3"^@"
‘C-g’の2進コードは111、‘C-@’はコード0の文字なので、この結果は道理にかなっています。
長さが8の倍数でない場合、プリント表現には余分な要素が表示されますが、これらの余分な要素に意味はありません。たとえば以下の例では、最初の3ビットだけが使用されるので、2つのブールベクターは等価です:
(equal #&3"\377" #&3"\007")
⇒ t
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ハッシュテーブルは非常に高速な照合テーブルの一種で、キーを対応する値にマップするalistと似ていますが、より高速です。ハッシュテーブルのプリント表現、以下のようにハッシュテーブルのプロパティーと内容を指定します:
(make-hash-table)
⇒ #s(hash-table size 65 test eql rehash-size 1.5
rehash-threshold 0.8 data ())
ハッシュテーブルについての詳細な情報は、Hash Tablesを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
他のプログラミング言語の関数と同様に、Lisp関数は実行可能なコードです。他の言語とは異なり、Lispの関数はLispオブジェクトでもあります。Lispのコンパイルされていない関数はラムダ式
— つまり1番目の要素がシンボルlambdaであるリストです(Lambda Expressionsを参照してください)。
ほとんどのプログラミング言語では、名前のないの関数はありません。Lispでは、関数に本質的な名前はありません。名前がなくても、ラムダ式を関数として呼び出すことができます。これを強調するために、わたしたちはこれを無名関数(anonymous function)とも呼びます(Anonymous Functionsを参照してください)。Lispの名前つき関数は、関数セルに有効な関数がセットされた単なるシンボルです(Defining Functionsを参照してください)。
ほとんどの場合、関数はLispプログラム内のLisp式に名前が記述されたところで呼び出されます。しかし、実行時に関数オブジェクトを構築または取得してから、基本関数funcallおよびapplyにより呼び出すことができます。Calling Functionsを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lispマクロ(Lisp
macro)は。Lisp言語を拡張する、ユーザー定義の構成です。これはオブジェクトとしてではなく関数のように表現されますが、引数の渡し方の意味が異なります。Lispマクロの形式はリストです。これは、最初の要素がmacroで、(lambdaシンボルを含む)CDRがLisp関数オブジェクトであるようなリストです。
Lispマクロオブジェクトは通常、ビルトインのdefmacro関数で定義されますが、macroで始まる任意のリストも、Emacsにとってはマクロです。マクロを記述する方法の説明は、Macrosを参照してください。
警告: Lispマクロとキーボードマクロ(Keyboard Macrosを参照してください)は、完全に別物です。修飾なしで“マクロ”という単語を使用したときは、キーボードマクロではなく、Lispマクロのことを指します。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
基本関数(primitive function)とは、Cプログラミング言語で記述された、Lispから呼び出せる関数です。基本関数はsubrsやビルと陰関数(built-in functions)とも呼ばれます(単語“subr”は、“サブルーチン(subroutine)”が由来です)。ほとんどの基本関数、呼び出されたとき、すべての引数を評価します。すべての引数を評価しない基本関数は、スペシャルフォーム(special form)と呼ばれます(Special Formsを参照してください)。
呼び出す側からすれば、その関数が基本関数かどうかは、問題になりません。しかし、基本関数をLispで記述された関数で再定義した場合は、問題になります。理由は、その基本関数がCコードから直接呼び出されているかもしれないからです。Lispから再定義した関数を呼び出すと、これは新しい定義を使用するでしょうが、Cコードから呼び出すと、ビルトインの定義が使用されるでしょう。したがって、基本関数の再定義はしないでください。
関数(function)という用語により、LispやCで記述された、すべてのEmacs関数を参照します。Lispで記述された関数についての情報は、Function Typeを参照してください。
基本関数に入力構文はなく、サブルーチン名とともにハッシュ表記でプリントします。
(symbol-function 'car) ; そのシンボルの関数セルに ; アクセスします。 ⇒ #<subr car> (subrp (symbol-function 'car)) ; これは基本関数か? ⇒ t ; イェース。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バイトコード関数オブジェクト(byte-code function objects)は、Lispコードをバイトコンパイルすることにより生成されます(Byte Compilationを参照してください)。内部的には、バイトコード関数オブジェクトは、ベクターによく似ています。しかしバイトコード関数オブジェクトが関数呼び出しのように見える場合、評価プロセスにより、このデータ型は特別に処理されます。Byte-Code Function Objectsを参照してください。
バイトコード関数オブジェクトのプリント表現と入力構文は、ベクターのものと似ていますが、開き角カッコ‘[’の前に‘#’があります。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
autoloadオブジェクト(autoload
object)は、最初の要素がシンボルautoloadのリストです。これはシンボルの関数定義として保存され、実際の定義にたいする代替としての役割をもちます。autoloadオブジェクトは、必要な時にロードされるLispコードファイルのなかで、実際の定義を見つけることができることを宣言します。これにはファイル名と、加えて実際の定義についての他のいくつかの情報が含まれます。
ファイルがロードされた後、そのシンボルは、autoloadオブジェクトではない、新しい関数定義をもつはずです。新しい定義は、最初からそこにあったかのように呼び出されます。ユーザーの観点からは、関数呼び出しは期待された動作、つまりロードされたファイル内の関数定義を使用します。
autoloadオブジェクトは通常、シンボルの関数セルにオブジェクトを保存する、関数autoloadにより作成されます。詳細は、Autoloadを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
前のセクションの型は一般的なプログラミングの目的のために使用され、これらのほとんどは、ほとんどのLisp方言で一般的です。Emacs Lispは、編集に関する目的のために、いくつかの追加のデータ型を提供します。
| 2.4.1 Buffer Type | 編集のための基本オブジェクト。 | |
| 2.4.2 Marker Type | バッファー内の位置。 | |
| 2.4.3 Window Type | バッファーはウィンドウ内に表示されます。 | |
| 2.4.4 Frame Type | ウィンドウはフレームを細分します。 | |
| 2.4.5 Terminal Type | フレームを表示する端末デバイス。 | |
| 2.4.6 Window Configuration Type | フレームが細分化された方法を記録する。 | |
| 2.4.7 Frame Configuration Type | すべてのフレームの状態を記録する。 | |
| 2.4.8 Process Type | 背後のOS上で実行されるEmacsのサブプロセス。 | |
| 2.4.9 Stream Type | 文字の受信と送信。 | |
| 2.4.10 Keymap Type | キーストロークがどの関数を呼び出すか。 | |
| 2.4.11 Overlay Type | オーバーレイが表示される方法。 | |
| 2.4.12 Font Type | テキストを表示するフォント。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バッファー(buffer)とは、編集されるテキストを保持するオブジェクトです(Buffersを参照してください)。ほとんどのバッファーはディスクファイル(Filesを参照してください)の内容を保持するので、それらは編集できますが、他の目的のために使用されるものもいくつかあります。ほとんどのバッファーは、ユーザーにより閲覧されることも意図しているので、いつかはウィンドウ内(Windowsを参照してください)に表示されます。しかしバッファーはウィンドウに表示される必要はありません。バッファーはそれぞれ、ポイント(point)と呼ばれる位置指定をもちます(Positionsを参照してください)。ほとんどの編集コマンドは、カレントバッファー内のポイントに隣接する内容を処理します。常に1つのバッファーがカレントバッファー(current buffer)です。
バッファーの内容は文字列によく似ていますが、バッファーはEmacs Lispの文字列と同じようには使用されず、利用可能な操作は異なります。文字列にテキストを“挿入”するためには、部分文字列の結合が必要で、結果は完全に新しい文字列オブジェクトなのに比べて、バッファーでは既存のバッファーに効率的にテキストを挿入して、バッファーの内容を変更できます。
標準的なEmacs関数の多くは、カレントバッファー内の文字を操作したりテストするためのものです。このマニュアルには、これらの関数の説明のために、1つのチャプターをあてています(Textを参照してください)。
他のデータ構造のいくつかは、各バッファーに関連付けられています:
ローカルキーマップと変数リストは、具ローマルナバインディングや値を個別にオーバーライドするためのエントリーを含みます。これらは、実際にプログラムを変更することなく、異なるバッファーでのプログラムの振る舞いをカスタマイズするために使用されます。
バッファーはインダイレクト(indirect: 間接) — つまり他のバッファーとテキストを共有するが、それぞれ別に表示する — かもしれません。Indirect Buffersを参照してください。
バッファーに入力構文はありません。バッファーはバッファー名を含むハッシュ表記でプリントされます。
(current-buffer)
⇒ #<buffer objects.texi>
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マーカー(marker)は、特定のバッファー内の位置を表します。したがってマーカーには2つの内容 — 1つはバッファー、もう1つは位置 — をもちます。バッファーのテキストの変更では、マーカーが常にバッファー内の同じ2つの文字の間に位置することを確実にするために、必要に応じて自動的に位置の値が再配置されます。
マーカーは入力構文をもちません。マーカーは、カレントの文字位置と、そのバッファー名を与える、ハッシュ表記でプリントされます。
(point-marker)
⇒ #<marker at 10779 in objects.texi>
マーカーのテスト、作成、コピー、移動の方法についての情報は、Markersを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ウィンドウ(window)はEmacsがバッファーを表示するために使用する端末スクリーンの部分を記述します。すべてのウィンドウは関連付けられた1つのバッファーをもち、バッファーの内容はそのウィンドウに表示されます。対照的に、あるバッファーは、1つのウィンドウに表示されるか、ウィンドウに表示されないか、それとも複数のウィンドウに表示されるかもしれません。
同時に複数のウィンドウが存在するかもしれませんが、常に1つのウィンドウが選択されたウィンドウ(selected window)になります。Emacsがコマンドにたいして準備できているときに、(通常は)カーソルが表示されるウィンドウが、選択されたウィンドウです。選択されたウィンドウは通常、カレントバッファーを表示しますが、これは必須ではありません。
スクリーン上でウィンドウはフレームにグループ化されます。各ウィンドウは、ただ1つだけのフレームに属します。Frame Typeを参照してください。
ウィンドウは入力構文をもちません。ウィンドウは、ウィンドウ番号、表示されているバッファー名を与える、ハッシュ表記でプリントされます。与えられたウィンドウに表示されるバッファーは頻繁に変更されるかもしれないので、一意にウィンドウを識別するためにウィンドウ番号が存在します。
(selected-window)
⇒ #<window 1 on objects.texi>
ウィンドウに作用する関数の説明は、Windowsを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
フレーム(frame)とは、1つ以上のEmacsウィンドウを含むスクリーン領域です。スクリーン領域を参照するためにEmacsが使用するLispオブジェクトを指す場合も、“フレーム”という用語を使用します。
フレームは入力構文をもちません。フレームはフレームのタイトル、(フレームを一意に識別するのに便利な)メモリー内のアドレスを与えるハッシュ表記でプリントされます。
(selected-frame)
⇒ #<frame emacs@psilocin.gnu.org 0xdac80>
フレームに作用する関数の説明は、Framesを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
端末(terminal)は、1つ以上のEmacsフレーム(Frame Typeを参照してください)を表示する能力があるデバイスです。
端末は入力構文をもちません。端末は、その端末の順序番号、TTYデバイスファイル名を与える、ハッシュ表記でプリントされます。
(get-device-terminal nil)
⇒ #<terminal 1 on /dev/tty>
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ウィンドウ構成(window configuration)は、フレーム内のウィンドウの位置、サイズ、内容についての情報を保持します。これにより後で同じウィンドウ配置を再作成できます。
ウィンドウ構成は入力構文をもちません。ウィンドウ構成のプリント表現は、‘#<window-configuration>’のようになります。ウィンドウ構成に関連するいくつかの関数の説明は、Window Configurationsを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
フレーム構成(frame
configuration)は、すべてのフレーム内のウィンドウの位置、サイズ、内容についての情報を保持します。これは基本型ではありません —
実際のところ、これはCARがframe-configurationで、CDRがalistのリストです。各alist要素は、その要素のCARに示される1つのフレームを記述します。
フレーム構成に関連するいくつかの関数の説明は、Frame Configurationsを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
単語プロセス(process)は通常、実行中のプログラムを意味します。Emacs自身はこの種のプロセス内で実行されます。しかしEmacs Lispでは、プロセスとはEmacsプロセスにより作成されたサブプロセスを表す、Lispオブジェクトです。シェル、GDB、ftp、コンパイラーなどのプログラムは、Emacsのサブプロセスとして実行され、Emacsの能力を拡張します。さらに操作を行なうために、Emacsサブプロセスは、Emacsからテキスト入力を受け取り、テキスト出力をEmacsにreturnします。Emacsは、サブプロセスにシグナルを送ることもできます。
プロセスオブジェクトは入力構文をもちません。プロセスオブジェクトは、プロセス名を与えるハッシュ表記でプリントされます。
(process-list)
⇒ (#<process shell>)
プロセスの作成、削除、プロセスに関する情報のreturn、入力やシグナルの送信、出力の受信を行なう関数についての情報は、Processesを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ストリーム(stream)とは、文字のソースまたはシンクとして — つまり入力として文字を供給したり、出力として文字を受け入れるために使用できるオブジェクトです。多くの異なるタイプ — マーカー、バッファー、文字列、関数を、この方法で使用できます。ほとんどの場合、入力ストリーム(文字列ソース)は、キーボード、バッファー、ファイルから文字を受け取り、出力ストリーム(文字シンク)は文字を*Help*バッファーのようなバッファー、エコーエリアに文字を送ります。
オブジェクトnilは、他の意味に加えて、ストリームとして使用されることがあります。nilは変数standard-inputやstandard-outputの値を表します。オブジェクトtも、入力としてミニバッファー(Minibuffersを参照してください)、出力としてエコーエリア(The Echo Areaを参照してください)の使用を指定するストリームになります。
ストリームは特別なプリント表現や入力構文をもたず、何であれ、それらの基本型としてプリントされます。
パース関数およびプリント関数を含む、ストリームに関連した関数の説明は、Reading and Printing Lisp Objectsを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
キーマップ(keymap)は、ユーザーがタイプした文字を、コマンドにマップします。このマップは、ユーザーのコマンド入力が実行される方法を制御します。キーマップは、実際にはCARがシンボルkeymapのリストです。
キーマップの作成、プレフィクスキーの処理、ローカルキーマップやグローバルキーマップ、キーバインドの変更についての情報は、Keymapsを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
オーバーレイ(overlay)は、バッファーの一部に適用するプロパティーを指定します。それぞれのオーバーレイはバッファーの指定された範囲に適用され、プロパティーリスト(プロパティー名と値が交互に記述された要素のリスト)を含みます。オーバーレイプロパティーは、バッファーの指定された一部を、一時的に異なるスタイルで表示するために使用されます。オーバーレイは入力構文をもたず、バッファーメイト範囲の位置を与えるハッシュ表記でプリントされます。
オーバーレイを作成したり使用する方法についての情報は、Overlaysを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
fontは、グラフィカルな端末上のテキストを表示する方法を指定します。実際には異なる3つのフォント型 — フォントオブジェクト(font objects)、フォントスペック(font specs)、フォントエンティティー(font entities) — が存在しますこれらは入力構文をもちません。これらのプリント構文は、‘#<font-object>’、‘#<font-spec>’、‘#<font-entity>’のようになります。これらのLispオブジェクトの説明は、Low-Level Font Representationを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
複雑なLispオブジェクトにおける共有された構造、または循環する構造を表すために、リーダー構成‘#n=’と‘#n#’を使用することができます。
後でオブジェクトを参照するには、オブジェクトの前で#n=を使用します。その後で、他の場所にある同じオブジェクトを参照するために、#n#を使用することができます。ここでnは任意の整数です。たとえば以下は、1番目の要素が3番目の要素にも繰り替えされるリストを作成する方法です:
(#1=(a) b #1#)
これは、以下のような通常の構文とは異なります
((a) b (a))
これは1番目の要素と3番目の要素がそっくりなリストですが、これらは同じLispオブジェクトではありません。以下で違いを見ることができます:
(prog1 nil
(setq x '(#1=(a) b #1#)))
(eq (nth 0 x) (nth 2 x))
⇒ t
(setq x '((a) b (a)))
(eq (nth 0 x) (nth 2 x))
⇒ nil
“要素”として自身を含むような、循環する構造を作成するために、同じ構文を使用できます。以下は例です:
#1=(a #1#)
これは、2番目の要素がそのリスト自身であるリストを作成します。これが実際にうまくいくのか、以下で確認できます:
(prog1 nil
(setq x '#1=(a #1#)))
(eq x (cadr x))
⇒ t
変数print-circleを非nil値にバインドした場合、Lispプリンターは、循環および共有されるLispオブジェクトを記録するこの構文を、生成することができます。Variables Affecting Outputを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lispインタープリター自身は、関数が呼び出されたときに、その関数に渡された実際の引数にたいする型チェックは行ないません。それが行なえないのは、Lispにおける関数の引数は、他のプログラミング言語のようなデータ型宣言をもたないからです。したがって実際の引数が、その関数が使用できる型に属するかどうかをテストするのは、それぞれの関数に任されています。
すべてのビルトイン関数は、適切なときに実際の引数の型チェックを行い、引数の型が違う場合は、wrong-type-argumentエラーをシグナルします。たとえば以下は、+の引数に、+が扱うことができない引数を渡したとき何が起こるかの例です:
(+ 2 'a)
error→ Wrong type argument: number-or-marker-p, a
異なる型にたいして異なる処理をプログラムに行なわせる場合は、明示的に型チェックを行なわなければなりません。オブジェクトの型をチェックするもっとも一般的な方法は、型述語(type predicate)関数の呼び出しです。Emacsはそれぞれの型にたいする型述語をもち、組み合わされた型にたいする述語もあります。
型述語関数は1つの引数をとり、その引数が適切な型であればt、そうでない場合はnilをreturnします。述語関数にたいする一般的なLisp慣習にしたがい、ほとんどの型述語の名前は、‘p’で終わります。
以下はリストにたいしてチェックを行なう述語listpと、シンボルにたいしてチェックを行なう述語symbolpの例です。
(defun add-on (x)
(cond ((symbolp x)
;; If X is a symbol, put it on LIST.
(setq list (cons x list)))
((listp x)
;; If X is a list, add its elements to LIST.
(setq list (append x list)))
(t
;; We handle only symbols and lists.
(error "Invalid argument %s in add-on" x))))
以下の表は、事前定義された型述語(アルファベット順)と、さらに情報を得るためのリファレンスです。
atomatomを参照してください。
arrayparraypを参照してください。
bool-vector-pbool-vector-pを参照してください。
bufferpbufferpを参照してください。
byte-code-function-pbyte-code-function-pを参照してください。
case-table-pcase-table-pを参照してください。
char-or-string-pchar-or-string-pを参照してください。
char-table-pchar-table-pを参照してください。
commandpcommandpを参照してください。
conspconspを参照してください。
custom-variable-pcustom-variable-pを参照してください。
display-table-pdisplay-table-pを参照してください。
floatpfloatpを参照してください。
fontpLow-Level Font Representationを参照してください。
frame-configuration-pframe-configuration-pを参照してください。
frame-live-pframe-live-pを参照してください。
framepframepを参照してください。
functionpfunctionpを参照してください。
hash-table-phash-table-pを参照してください。
integer-or-marker-pinteger-or-marker-pを参照してください。
integerpintegerpを参照してください。
keymappkeymappを参照してください。
keywordpVariables that Never Changeを参照してください。
listplistpを参照してください。
markerpmarkerpを参照してください。
wholenumpwholenumpを参照してください。
nlistpnlistpを参照してください。
numberpnumberpを参照してください。
number-or-marker-pnumber-or-marker-pを参照してください。
overlaypoverlaypを参照してください。
processpprocesspを参照してください。
sequencepsequencepを参照してください。
stringpstringpを参照してください。
subrpsubrpを参照してください。
symbolpsymbolpを参照してください。
syntax-table-psyntax-table-pを参照してください。
vectorpvectorpを参照してください。
window-configuration-pwindow-configuration-pを参照してください。
window-live-pwindow-live-pを参照してください。
windowpwindowpを参照してください。
booleanpbooleanpを参照してください。
string-or-null-pstring-or-null-pを参照してください。
あるオブジェクトがどの型かチェックするもっとも一般的な方法は、関数type-ofの呼び出しです。オブジェクトは、ただ1つだけの基本型に属することを思い出してください。type-ofは、それがどの型(Lisp Data Typesを参照してください)か告げます。しかしtype-ofは基本型以外の型については何も知りません。ほとんどの場合、type-ofより型述語を使用するほうが便利でしょう。
この関数はobjectの基本型を名前とする、シンボルをreturnします。retuen値はシンボルbool-vector、buffer、char-table、compiled-function、cons、float、font-entity、font-object、font-spec、frame、hash-table、integer、marker、overlay、process、string、subr、symbol、vector、window、window-configurationのうちの1つです。
(type-of 1)
⇒ integer
(type-of 'nil)
⇒ symbol
(type-of '()) ; ()はnilです。
⇒ symbol
(type-of '(x))
⇒ cons
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ここでは、2つのオブジェクトの同一性をテストする関数を説明します。(たとえば文字列などの)特定の型のオブジェクト同士で、内容の同一性をテストするのは、別の関数を使用します。これらの述語にたいしては、そのデータ型を説明する、適切なチャプターを参照してください。
この関数はobject1とobject2が同じオブジェクトの場合はt、それ以外はnilをreturnします。
object1とobject2が、同じ値をもつ整数の場合、これらは同じオブジェクトと判断されます(eqはtをreturnします)。object1とobject2が、同じ名前のシンボルの場合、通常は同じオブジェクトです。しかし例外もあります。Creating and Interning Symbolsを参照してください。(リスト、ベクター文字列などの)他の型にたいしては、同じ内容(または要素)の2つの引数が、両者eqである必要はありません。これらが同じオブジェクトの場合だけeqであり、その場合は、一方の内容を変更すると、もう一方の内容にも同じ変更が反映されます。
(eq 'foo 'foo)
⇒ t
(eq 456 456)
⇒ t
(eq "asdf" "asdf")
⇒ nil
(eq "" "")
⇒ t
;; この例外は省スペースのためにEmacs Lispが
;; ただ1つのマルチバイトの空文字列を作成するためです。
(eq '(1 (2 (3))) '(1 (2 (3))))
⇒ nil
(setq foo '(1 (2 (3))))
⇒ (1 (2 (3)))
(eq foo foo)
⇒ t
(eq foo '(1 (2 (3))))
⇒ nil
(eq [(1 2) 3] [(1 2) 3])
⇒ nil
(eq (point-marker) (point-marker))
⇒ nil
make-symbol関数は、internされていないシンボルをreturnします。これはLisp式内で、その名前を記述したシンボルとは区別されます。同じ名前の、異なるシンボルは、eqではありません。Creating and Interning Symbolsを参照してください。
(eq (make-symbol "foo") 'foo)
⇒ nil
この関数は、object1とobject2が同じ構成要素をもつ場合はt、それ以外はnilをreturnします。eqは引数が同じオブジェクトなのかテストするのにたいして、equalは同一でない引数の内部を調べて、それらの要素または内容が同一化をテストします。したがって2つのオブジェクトがeqならば、それらはequalです。しかし、その逆は常に真ではありません。
(equal 'foo 'foo)
⇒ t
(equal 456 456)
⇒ t
(equal "asdf" "asdf")
⇒ t
(eq "asdf" "asdf")
⇒ nil
(equal '(1 (2 (3))) '(1 (2 (3))))
⇒ t
(eq '(1 (2 (3))) '(1 (2 (3))))
⇒ nil
(equal [(1 2) 3] [(1 2) 3])
⇒ t
(eq [(1 2) 3] [(1 2) 3])
⇒ nil
(equal (point-marker) (point-marker))
⇒ t
(eq (point-marker) (point-marker))
⇒ nil
文字列の比較は大文字小文字を区別しますが、テキストプロパティーは考慮しません — これは文字列内の文字だけを比較します。Text Propertiesを参照してください。テキストプロパティーも比較する場合は、equal-including-propertiesを使用します。記述的な理由により、ユニバイト文字列とマルチバイト文字列は、それらが同じ文字シーケンスを含み、それらすべてのコードが0から127(ASCII)、または160から255(8ビットグラフィック)の場合に限り、equalです(Text Representationsを参照してください)。
(equal "asdf" "ASDF")
⇒ nil
しかし2つの別のバッファーは、それらのテキスト内容が同じでも、equalと判断されることはありません。
equalのテストは再帰により実装されています。たとえば2つのコンスセルxとyを与えると、(equal
x y)は、以下の式の両方がtをreturnする場合に限り、tをreturnします:
(equal (car x) (car y)) (equal (cdr x) (cdr y))
これは再帰処理なので、循環するリストがあると無限再帰となります(エラーとなります)。
この関数はすべてのケースにおいてequalと同様に振る舞いますが、2つの文字列がequalになるためには、それらが同じテキストプロパティーをもつ必要があります。
(equal "asdf" (propertize "asdf" 'asdf t))
⇒ t
(equal-including-properties "asdf"
(propertize "asdf" 'asdf t))
⇒ nil
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GNU Emacsは2つの数値データ型 — 整数(integers)と浮動小数点数(floating-point numbers)をサポートします。整数は-3、0、7、13、511などの整数です。浮動小数点数は-4.5、0.0、2.71828などの小数部をもちます・これらは指数記数法でも表現できます — ‘1.5e2’は‘150.0’と同じです。ここで‘e2’は10の2乗をあらわし、それに1.5を乗じるという意味です。整数計算は正確であり、オーバーフローするときもあります。浮動小数点数の計算においては、数値は固定された精度をもつため、、しばしば丸め誤差(rounding errors)を引き起こします。
| 3.1 Integer Basics | 整数の表現と範囲。 | |
| 3.2 Floating-Point Basics | 浮動少数の表現と範囲。 | |
| 3.3 Type Predicates for Numbers | 数にたいするテスト。 | |
| 3.4 Comparison of Numbers | 同一性と非同一性の述語。 | |
| 3.5 Numeric Conversions | 手動小数点数から整数、または疎の逆の変換。 | |
| 3.6 Arithmetic Operations | 加減乗除の方法。 | |
| 3.7 Rounding Operations | 浮動小数点数の明示的な丸め。 | |
| 3.8 Bitwise Operations on Integers | 論理的なadd、or、not、shift。 | |
| 3.9 Standard Mathematical Functions | 三角法、指数、対数関数。 | |
| 3.10 Random Numbers | 予測可能または不可能な乱数の取得。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
整数の値の範囲はマシンに依存します。最小の範囲は-536,870,912から536,870,911(30ビット長の -2**29 から 2**29 - 1) ですが、多くのマシンはこれより広い範囲を提供します。このチャプターの例の多くは、最小の整数は30ビット長であると仮定します。
Lispリーダーは、(オプションで最初の符号記号と、最後のピリオドをともなう)数字のシーケンスとして整数を読み取ります。Emacsの範囲を超える整数は、浮動小数点数として扱われます。
1 ; 整数1。 1. ; 整数1。 +1 ; これも整数1。 -1 ; 整数-1。 9000000000000000000 ; 浮動小数点数9e18. 0 ; 整数0 -0 ; 整数0
基数が10以外の整数の構文は、‘#’の後に基数を指定する文字 — 2進は‘b’、8進は‘o’、16進は‘x’、‘radixr’は基数radix — を記述します。基数を指定する文字の大文字小文字は区別されません。したがって‘#binteger’はintegerを2進として読み取り、‘#radixrinteger’はintegerを基数radixとして読み取ります。radixに指定できる値は2から36です。たとえば:
#b101100 ⇒ 44 #o54 ⇒ 44 #x2c ⇒ 44 #24r1k ⇒ 44
整数にたいして処理を行なうさまざまな関数、特にビット演算(Bitwise Operations on Integersを参照してください)を理解するためには、数を2進形式で見ることが助けになることがしばしばあります。
30ビットの2進では、10進数の整数5は以下のようになります:
0000...000101 (全部で30ビット)
(‘...’は30ビットのワードを満たすのに充分なビットを意味し、この場合の‘...’は12個の0ビットを意味します。以下の例でも、2進の整数を読みやすくするために、‘...’の表記を使用します)
整数の-1は、以下のようになります:
1111...111111 (全部で30ビット)
-1は30個の1で表現されます(これは2の補数表記と呼ばれます)。
-1から4を減じることにより、負の整数-5が得られます。10進の整数4は、2進では100です。したがって、-5は以下のようになります:
1111...111011 (全部で30ビット)
この実装では、0ビットの2進の最大は、10進の536,870,911です。これは2進では以下のようになります:
0111...111111 (全部で30ビット)
算術関数は整数が範囲の外かをチェックしないので、536,870,911に1を加えると、その値は負の整数-536,870,912になります:
(+ 1 536870911)
⇒ -536870912
⇒ 1000...000000 (全部で30ビット)
このチャプターで説明する多くの関数は、数字の位置として引数にマーカー(Markersを参照してください)を受け取ります。そのような関数にたいする実際の引数は数字かマーカーなので、わたしたちはこれらの引数にnumber-or-markerという名前を与えることがあります。引数の値がマーカーの場合、マーカーの位置が使用され、マーカーのバッファーは無視されます。
この変数の値は、Emacs Lispが扱える整数の最大値です。典型的な値は32ビットでは 2**29 - 1 、64ビットでは 2**61 - 1 です。
この変数の値は、Emacs Lispが扱える最小の整数です。これは負の整数です。典型的な値は32ビットでは -2**29 、64ビットでは -2**61、 です。
Emacs
Lispでは、テキスト文字は整数により表現されます。0から(max-char)までの整数は、有効な文字として判断されます。Character Codesを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
浮動小数点数は整数ではない数を表現するのに便利です。浮動小数点数の範囲は、使用しているマシンでのCデータ型のdoubleと同じ範囲です。現在Emacsでサポートされているすべてのコンピューターでは、これは倍精度のIEEE浮動小数点数です。
浮動小数点数にたいする入力構文は、小数点と指数のどちらか1つ、または両方が必要とします。オプションの符号(‘+’か‘-’)は、その数字と指数の前に記述します。たとえば、‘1500.0’、‘+15e2’、‘15.0e+2’、‘+1500000e-3’、‘.15e4’は、値が1500の浮動小数点数を記述する5つの方法です。これらはすべて等価です。Common Lispと同様、Emacs Lispは、浮動小数点数の小数点の後に、少なくとも1つの数字を必要とします。‘1500.’は整数であり、浮動小数点数ではありません。
Emacs
Lispは-0.0を、equalと=に関して、通常の0と数学的に同じものとして扱います。これは、(他の処理がこれらを区別するとしても、-0.0と0.0は数学的に等しいとする)IEEE浮動小数点数規格にしたがっています。
IEEE浮動小数点数規格は、浮動小数点数として、正の無限大と、負の無限大をサポートします。この規格はNaNまたは“not-a-number(数字ではない)”と呼ばれる値クラスも提供します。数学関数は、正しい答えが存在しないような場合に、このような値をreturnします。たとえば(/
0.0 0.0)はNaNをreturnします。NaN値に符号がついていたとしても、実用的な目的にたいして、Emacs
Lispにおける異なるNaN値に、意味のある違いはありません。
以下は、これらの特別な浮動小数点数にたいする入力構文です:
‘1.0e+INF’と‘-1.0e+INF’
‘0.0e+NaN’と‘-0.0e+NaN’
以下の関数は浮動小数点数を扱うために特化したものです:
この述語は浮動小数引数がNaNのときはt、それ以外はnilをreturnします。
この関数はコンスセル(s
.
e)をreturnします。ここでsとeは、浮動小数点数のsignificand(浮動小数点数を2の指数表現したときの仮引数)と指数です。
xが有限の場合、sは0.5以上1.0未満の浮動小数点数で、eは整数で、 x = s * 2**eです。 xが0または無限の場合、sはxと等しくなります。xがNaNの場合は、sもNaNです。xが0の場合、eは0です。
この関数は、significandがsig、指数がexpの浮動小数点数をreturnします。
koの関数はx2の、x1の値にコピーして、その結果をreturnします。x1とx2は浮動小数でなければなりません。
この関数はxの2進指数をreturnします。より正確にいうと、この値は|x|の2を底とする対数を、整数に切り下げたものです。
(logb 10)
⇒ 3
(logb 10.0e20)
⇒ 69
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションの関数は、数または数の特定の型にたいしてテストを行ないます。関数integerpおよびfloatpは、引き数として任意のLispオブジェクト型をとることができます(そうでないと、あまり使用する機会がありません)。しかし、述語zeropは、引き数として数を要求します。Predicates on Markersのinteger-or-marker-pとnumber-or-marker-pも参照してください。
この述語は、引数が浮動小数かどうかをテストして、もしそうならt、それ以外はnilをreturnします。
この述語は引数が整数かどうかをテストして、もしそうならt、それ以外はnilをreturnします。
この述語は引数が数(整数か浮動小数)かどうかをテストして、もしそうならt、それ以外はnilをreturnします。
この述語(名前は“natural
number(自然数)”が由来です)は、引数が正の整数かどうかをテストして、もしそうならt、それ以外はnilをreturnします。0は整数と判断されます。
wholenumpは、natnumpにたいするシノニムです。
この述語は、引数が0かどうかをテストして、もしそうならt、それ以外はnilをreturnします。引数は数でなければなりません。
(zerop x)は、(= x 0)と等価です。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
数が数値的に等しいかテストするためには、eqではなく、通常は=を使用するべきです。同じ数値をもつ、多くの浮動小数オブジェクトが存在するかもしれません。これらを比較するのにeqを使用する場合、これは2つの値が同じオブジェクトかどうかをテストすることになります。対照的に、=はオブジェクトの数値的な値だけを比較します。
Emacs
Lispでは、それぞれの整数はは、一意なLispオブジェクトです。したがって、整数に関しては、eqは=と同じです。未知の整数の値を比較するのに、eqを使用するのが便利な場合があります。なぜなら未知の値が数字でない場合でも、eqはエラーを報告しません。対照的に、引数が数でもマーカーでもない場合、=はエラーをシグナルします。しかし、整数の比較においてさえ、使用できる場合は=を使用するのが、よいプログラミング習慣です。
数の比較において、2つの数が同じデータ型(どちらも整数、またはどちらも浮動小数)で、同じ値の場合は等しい数として扱う、equalのほうが便利なときもあります。対照的に、=は、整数と浮動小数点数を等しい数と扱うことができます。Equality Predicatesを参照してください。
他の欠点もあります。浮動小数演算は正確ではないので、浮動小数値を比較するのが悪いアイデアのときが、しばしばあります。通常は、近似的に等しいことをテストするほうがよいでしょう。以下はこれを行なう関数です:
(defvar fuzz-factor 1.0e-6)
(defun approx-equal (x y)
(or (= x y)
(< (/ (abs (- x y))
(max (abs x) (abs y)))
fuzz-factor)))
Common Lispに関する注意: Common Lispは複数ワード整数を実装していて、2つの別の整数オブジェクトが、同じ数値的な値をもつことができるので、Common Lispでの数の比較は、常に
=が要求されます。Emacs Lispの整数は範囲が制限されているため、与えられた値に対応する整数オブジェクトは、1つだけです。
この関数は、すべての引数が数値的に等しいかどうかをテストして、もしそうならt、それ以外はnilをreturnします。
この関数はeqと同様に振る舞いますが、引数が両方とも数のときは例外です。これは数を型と数値的な値により比較するので、(eql
1.0 1)はnilをreturnしますが、(eql 1.0 1.0)と(eql 1
1)はtをreturnします。
この関数は引数が数値的に等しいかどうかをテストして、もし異なる場合はt、等しい場合はnilをreturnします。
この関数は、各引数がそれぞれ、その後の引数より小さいかどうかをテストして、もしそうならt、それ以外はnilをreturnします。
この関数は、各引数がそれぞれ、その後の引数以下かどうかをテストして、もしそうならt、それ以外はnilをreturnします。
この関数は、各引数がそれぞれ、その後の引数より大きいかどうかをテストして、もしそうならt、それ以外はnilをreturnします。
この関数は、各引数がそれぞれ、その後の引数以上かどうかをテストして、もしそうならt、それ以外はnilをreturnします。
この関数は引数の最大をreturnします。引数のどれかが浮動小数の場合は、たとえ最大が整数であっても、浮動小数として値がreturnされます。
(max 20)
⇒ 20
(max 1 2.5)
⇒ 2.5
(max 1 3 2.5)
⇒ 3.0
この関数は引数の最小をreturnします。引数のどれかが浮動小数の場合は、たとえ最小が整数であっても、浮動小数として値がreturnされます。
(min -4 1)
⇒ -4
この関数はnumberの絶対値をreturnします。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
整数を浮動少数に変換するには、関数floatを使用します。
これは浮動小数に変換されたnumberをreturnします。すでにnumberが浮動小数の場合、floatはそれを変更せずにreturnします。
浮動小数点数を整数に変換する関数が4つあります。これらは浮動小数点数を丸める方法がことなります。これらはすべて引数numberと、オプション引数としてdivisorを受け取ります。引数は両方とも整数または浮動小数点数です。divisorがnilのこともあります。divisorがnilまたは省略された場合、これらの関数はnumberを整数に変換するか、それが既に整数の場合は変更せずにreturnします。divisorが非nilの場合、これらの関数はnumberをdivisorで除してから、その結果を整数に変換します。divisorが(整数か浮動小数かに関わらず)0の場合、Emacsはarith-errorエラーをシグナルします。
これは0に向かって丸めることにより整数に変換したnumberをreturnします。
(truncate 1.2)
⇒ 1
(truncate 1.7)
⇒ 1
(truncate -1.2)
⇒ -1
(truncate -1.7)
⇒ -1
これは、下方(負の無限大に向かって)に丸めることにより整数に変換したnumberをreturnします。
divisorが指定された場合、modに相当する種類の除算演算を使用して、下方に丸めを行ないます。
(floor 1.2)
⇒ 1
(floor 1.7)
⇒ 1
(floor -1.2)
⇒ -2
(floor -1.7)
⇒ -2
(floor 5.99 3)
⇒ 1
これは、上方(正の無限大に向かって)に丸めることにより整数に変換したnumberをreturnします。
(ceiling 1.2)
⇒ 2
(ceiling 1.7)
⇒ 2
(ceiling -1.2)
⇒ -1
(ceiling -1.7)
⇒ -1
これは、もっとも近い整数に向かって丸めることにより整数に変換したnumberをreturnします。2つの整数から等距離にある値の丸めでは、偶数の整数をreturnします。
(round 1.2)
⇒ 1
(round 1.7)
⇒ 2
(round -1.2)
⇒ -1
(round -1.7)
⇒ -2
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs
Lispは伝統的な4つの算術演算(加減乗除)、同様に剰余とmodulusの関数、および1加算、1減算の関数を提供します。%を除き、これらの各関数は引き数として整数か浮動小数を受け取り、浮動小数の引数がある場合は、浮動小数点数をreturnします。
Emacs Lispの算術関数は整数のオーバーフローをチェックしません。したがって(1+
536870911)は-536870912に評価されるかもしれず、それはハードウェアーに依存します。
この関数はnumber-or-marker + 1をreturnします。例えば、
(setq foo 4)
⇒ 4
(1+ foo)
⇒ 5
この関数はCの演算子++とは類似しません —
この関数は変数をインクリメントしません。この関数は和を計算するだけです、したがって以下を続けて評価すると、
foo
⇒ 4
変数をインクリメントしたい場合は、以下のようにsetqを使用しなければなりません:
(setq foo (1+ foo))
⇒ 5
この関数はnumber-or-marker - 1をreturnします。
この関数は引数すべてを加算します。引数を与えない場合、+は0をreturnします。
(+)
⇒ 0
(+ 1)
⇒ 1
(+ 1 2 3 4)
⇒ 10
-関数は2つの目的 — 符号反転と減算
—を果たします。-に1つの引数を与えた場合、値は引数の符号を反転したものになります。複数の引数がある場合、number-or-markerからmore-numbers-or-markersまでの各値を蓄積的に減算します。引数がない場合、結果は0です。
(- 10 1 2 3 4)
⇒ 0
(- 10)
⇒ -10
(-)
⇒ 0
この関数はすべての引数を乗じて、積をreturnします。引数がない場合、*は1をreturnします。
(*)
⇒ 1
(* 1)
⇒ 1
(* 1 2 3 4)
⇒ 24
この関数はdividendをdivisorで除し、商をreturnします。追加の引数divisorsがある場合、その後さらにdividendをdivisorsで順に除します。各引数は数かマーカーです。
すべての引数が整数の場合、結果は各除算の後に商を0へ向かって丸めることにより得られる整数になります。
(/ 6 2)
⇒ 3
(/ 5 2)
⇒ 2
(/ 5.0 2)
⇒ 2.5
(/ 5 2.0)
⇒ 2.5
(/ 5.0 2.0)
⇒ 2.5
(/ 25 3 2)
⇒ 4
(/ -17 6)
⇒ -2
整数を整数0で除すると、Emacsはarith-errorエラー(Errorsを参照してください)をシグナルします。浮動小数の除算においては、0でない数を0で除することにより、正の無限大または負の無限大を得ます(Floating-Point Basicsを参照してください)。
この関数は、dividendをdivisorで除した後、その剰余を整数でreturnします。引数は整数かマーカーでなければなりません。
任意の2つの整数dividendとdivisorにたいして、
(+ (% dividend divisor) (* (/ dividend divisor) divisor))
は、divisorが非0の場合は常にdividendと等しくなります。
(% 9 4)
⇒ 1
(% -9 4)
⇒ -1
(% 9 -4)
⇒ 1
(% -9 -4)
⇒ -1
この関数はdividendのdivisorにたいするmodulo、言い換えるとdividendをdivisorで除した後の剰余(ただし符号はdivisorと同じ)えおreturnします。引数は数かマーカーでなければなりません。
%とは異なり、modは浮動小数の引数を許容します。これは商を整数に下方(負の無限大に向かって)へ丸めて、剰余を計算するのにこの商を使用します。
divisorが0のときmodは、両方の引数が整数の場合はarith-errorエラーをシグナルし、それ以外はNaNをreturnします。
(mod 9 4)
⇒ 1
(mod -9 4)
⇒ 3
(mod 9 -4)
⇒ -3
(mod -9 -4)
⇒ -1
(mod 5.5 2.5)
⇒ .5
任意の2つの数dividendとdivisorにたいして、
(+ (mod dividend divisor) (* (floor dividend divisor) divisor))
は常にdividendになります(ただし引数のどちらかが浮動小数の場合は丸め誤差の範囲内で等しく、dividendが整数でdivisorが0の場合はarith-errorとなります)。floorについては、Numeric Conversionsを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
関数ffloor、fceiling、fround、ftruncateは、浮動小数の引数をとり、値が近くの整数であるような浮動少数をreturnします。ffloorは一番近い下方の整数、fceilingは一番近い上方の整数、ftruncateは0に向かう方向で一番近い整数、froundは一番近い整数をreturnします。
この関数はfloatを次に小さい整数値に丸めて、その値を浮動小数点数としてreturnします。
この関数はfloatを次に大きい整数値に丸めて、その値を浮動小数点数としてreturnします。
この関数はfloatを0方向の整数値に丸めて、その値を浮動小数点数としてreturnします。
この関数はfloatを一番近い整数値に丸めて、その値を浮動小数点数としてreturnします。2つの整数値との距離が等しい値にたいする丸めでは、偶数の整数をreturnします。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
コンピューターの中では、整数はビット(bit: 0か1の数字)のシーケンスである、2進数で表されます。ビット演算は、そのようなシーケンスの中の個々のビットに作用します。たとえば、シフト(shifting)はシーケンス全体を1つ以上左または右に移動して、“移動された”のと同じパターンを再生します。
Emacs Lispのビット演算は、整数だけに適用されます。
lshはlogical
shiftの略で、integer1のビットを左にcount個シフトします。countが負の場合は右にシフトし、シフトにより空きになったビットには0がセットされます。count
isが負の場合、lshは左端(最上位)に0をシフトするので、integer1が負の場合でも、正の結果が生成されます。これと対照的なのが、以下で説明するashです。
以下に、lshでビットパターンの位置を1つ左にシフトする例を2つ紹介します。ここでは下位8ビットの2進パターンだけを表示しており、残りのビットはすべて0です。
(lsh 5 1)
⇒ 10
;; 10進の5は、10進の10になります。
00000101 ⇒ 00001010
(lsh 7 1)
⇒ 14
;; 10進の7は、10進の14になります。
00000111 ⇒ 00001110
この例が説明するように、ビットパターンを左に1シフトすると、生成される数は、元の数の2倍になります。
ビットパターンを左に2シフトすると、以下(8ビット2進数)の結果が生成されます:
(lsh 3 2)
⇒ 12
;; 10進の3は、10進の12になります。
00000011 ⇒ 00001100
一方、右に1シフトすると、以下のようになります:
(lsh 6 -1)
⇒ 3
;; 10進の6は10進の3になります。
00000110 ⇒ 00000011
(lsh 5 -1)
⇒ 2
;; 10進の5は、10進の2になります。
00000101 ⇒ 00000010
例が明かにするように、右に1シフトすることにより、正の整数の値が2で除され、下方に丸められます。
関数lshは、他のEmacs
Lisp算術関数と同様、オーバーフローをチェックしないので、左にシフトすることにより上位ビットが捨てられ、その数の符号が変化するかもしれません。たとえば30ビットの実装では、536,870,911を左にシフトすると、-2が生成されます。
(lsh 536870911 1) ; 左シフト
⇒ -2
2進では、この引数は以下のようになります:
;; 10進の536,870,911
0111...111111 (全部で30ビット)
これを左にシフトすると、以下のようになります:
;; 10進の-2
1111...111110 (全部で30ビット)
ash (算術シフト(arithmetic
shift))は、integer1の中のビット位置を左にcountシフトします。countが負の場合は右にシフトします。
ashはlshと同じ結果を与えますが、例外はinteger1とcountがとみに負の場合です。この場合、lshは左にできる空きビットに0を置きますが、ashは1を置きます。
したがってashでビットパターンの位置を右に1シフトすると、以下のようになります:
(ash -6 -1) ⇒ -3
;; 10進の-6は、10進の-3になります
1111...111010 (30 bits total)
⇒
1111...111101 (30 bits total)
対照的に、lshでビットパターンの位置を1右にシフトすると、以下のようになります:
(lsh -6 -1) ⇒ 536870909
;; 10進の-6は、10進の536,870,909になります。
1111...111010 (30 bits total)
⇒
0111...111101 (30 bits total)
他にも例を示します:
; 30ビットの2進数 (lsh 5 2) ; 5 = 0000...000101 ⇒ 20 ; = 0000...010100
(ash 5 2)
⇒ 20
(lsh -5 2) ; -5 = 1111...111011
⇒ -20 ; = 1111...101100
(ash -5 2)
⇒ -20
(lsh 5 -2) ; 5 = 0000...000101 ⇒ 1 ; = 0000...000001
(ash 5 -2)
⇒ 1
(lsh -5 -2) ; -5 = 1111...111011 ⇒ 268435454 ; = 0011...111110
(ash -5 -2) ; -5 = 1111...111011 ⇒ -2 ; = 1111...111110
この関数は、引数の“論理積(logical and)”をreturnします。すべての引数のn番目のビットがセットされている場合に限り、結果のn番目のビットがセットされます(“セット”とは、そのビットの値が0ではなく1であることを意味します)。
たとえば、13と12の“論理積”は — 4ビット2進数を使用すると1101と1100の論理積は1100を生成します。この2進数では両方とも、左の2ビットがセット(つまり1)されているので、returnされる値の左2ビットがセットされます。しかし右の2ビットにたいしては、少なくとも1つの引数でそのビットが0なので、returnされる値の右2ビットは0になります。
したがって、
(logand 13 12)
⇒ 12
logandに何の引数も綿さない場合は、値-1がreturnされます。-1を2進数で表すとすべてのビットが1なので、-1はlogandにたいする単位元(identity
element)です。
; 30ビット2進数 (logand 14 13) ; 14 = 0000...001110 ; 13 = 0000...001101 ⇒ 12 ; 12 = 0000...001100
(logand 14 13 4) ; 14 = 0000...001110 ; 13 = 0000...001101 ; 4 = 0000...000100 ⇒ 4 ; 4 = 0000...000100
(logand)
⇒ -1 ; -1 = 1111...111111
この関数は、引数の“論理和(inclusive
or)”をreturnします。少なくとも1つの引数でn番目のビットがセットされていれば、結果のn番目のビットがセットされます。引数を与えない場合の結果は、この処理にたいする単位元である0です。logiorに渡す引数が1つだけの場合、その引数がreturnされます。
; 30ビット2進数 (logior 12 5) ; 12 = 0000...001100 ; 5 = 0000...000101 ⇒ 13 ; 13 = 0000...001101
(logior 12 5 7) ; 12 = 0000...001100 ; 5 = 0000...000101 ; 7 = 0000...000111 ⇒ 15 ; 15 = 0000...001111
この関数は、引数の“排他的論理和(exclusive
or)”をreturnします。n番目のビットがセットされている引数の数が奇数個の場合だけ、結果のn番目のビットがセットされます。引数を与えない場合の結果は、この処理の単位元である0となります。logxorに渡す引数が1つだけの場合、その引数がreturnされます。
; 30ビット2進数 (logxor 12 5) ; 12 = 0000...001100 ; 5 = 0000...000101 ⇒ 9 ; 9 = 0000...001001
(logxor 12 5 7) ; 12 = 0000...001100 ; 5 = 0000...000101 ; 7 = 0000...000111 ⇒ 14 ; 14 = 0000...001110
この関数は引数の論理的な補数(logical complement)をreturnします。integerのn番目のビットが0の場合に限り、結果のn番目のビットが1になります。逆も成り立ちます。
(lognot 5)
⇒ -6
;; 5 = 0000...000101 (全部で30ビット)
;; becomes
;; -6 = 1111...111010 (全部で30ビット)
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
これらの数学的関数は、引き数として整数と同様に浮動小数点数も許容します。
これらは三角関数です、引数argはラジアン単位です。
(asin arg)の値は、sinの値がargとなるような
-pi/2
から
pi/2
(境界値を含む)の数です。argが範囲外([-1, 1]の外)の場合、asinはNaNをreturnします。
(acos arg)の値は、cosの値がargとなるような、0から
pi
(境界値を含む)の数です。argが範囲外([-1, 1]の外)の場合、acosはNaNをreturnします。
(atan y)の値は、tanの値がyとなるような、
-pi/2
から
pi/2
(境界値を含まない)の数です。オプションの第2引数xが与えられた場合、(atan y
x)の値はベクトル[x, y]とX軸が成す角度のラジアン値です。
これは指数関数です。この関数はeの指数argをreturnします。
この関数は底をbaseとするargの対数をreturnします。baseを指定しない場合、自然底(natural
base)eが使用されます。argまたhbaseが負の場合、logはNaNをreturnします。
この関数はxにyを乗じてreturnします。引数が両方とも整数で、yが正の場合、結果は整数になります。この場合オーバーフローによる切り捨てが発生するので、注意してください。xが有限の負数で、yが有限の非整数の場合、exptはNaNをreturnします。
これはargの平方根をreturnします。argが有限で0より小さい場合、sqrtはNaNをreturnします。
加えて、Emacsは以下の数学的な定数を定義します:
自然対数e(2.71828…)。
円周率pi(3.14159…)。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
決定論的なコンピュータープログラムでは、真の乱数を生成することはできません。しかしほとんどの目的には、疑似乱数(pseudo-random numbers)で充分です。一連の疑似乱数は、決定論的な手法により生成されます。真の乱数ではありませんが、それらにはランダム列を模する特別な性質があります。たとえば疑似ランダム系では、すべての可能な値は、均等に発生します。
疑似乱数は“シード(seed:
種)”から生成されます。与えられた任意のシードから開始することにより、random関数は常に同じ数列を生成します。デフォルトでは、Emacsは開始時に乱数シードを初期化することにより、それぞれのEmacsの実行において、randomの値シーケンスは(ほとんど確実に)異なります。
再現可能な乱数シーケンスが欲しい場合もあります。たとえば乱数シーケンスに依存するプログラムをデバッグする場合、プログラムの各実行において同じ挙動を得ることが助けになります。再現可能なシーケンスを作成するには、(random
"")を実行します。これは特定のEmacsの実行可能ファイルにたいして、シードに定数値をセットします(しかし、この実行可能ファイルは、その他のEmacsビルドと異なるものになるでしょう)。シード値として、他のさまざまな文字列を使用することができます。
この関数は疑似乱数の整数をreturnします。繰り返し呼び出すと、一連の疑似乱数の整数をreturnします。
limitが正の整数の場合、値は負ではないlimit未満の値から選択されます。それ以外では、値はmost-negative-fixnumからmost-positive-fixnumの間の、Lispで表現可能な任意の整数(Integer Basicsを参照してください)になるでしょう。
limitがtの場合は、Emacsを再起動したときに、新しいシードを選択することを意味します。
limitが文字列の場合、その文字列定数にもとづいた新しいシードを選択することを意味します。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lispの文字列は、文字列の順序列(ordered sequence)を含む配列です。文字列はシンボル、バッファー、ファイルの名前に使用されます。その他にも、ユーザーにたいしてメッセージを送ったりバッファー間でコピーする文字列を保持したり等の、他の多くの目的にたいして使用されます。文字列は特に重要なので、Emacs Lispは特別に文字列を操作するための、多くの関数をもちます。Emacs Lispプログラムは、個々の文字より、文字列を多用します。
キーボードの文字イベントの文字列にたいする特別な考慮は、Putting Keyboard Events in Stringsを参照してください。
| 4.1 String and Character Basics | 文字列と文字の基本的なプロパティー。 | |
| 4.2 Predicates for Strings | オブジェクトが文字列か文字化をテストする。 | |
| 4.3 Creating Strings | 新しい文字列を割り当てる関数。 | |
| 4.4 Modifying Strings | 既存の文字列の内容を変更する。 | |
| 4.5 Comparison of Characters and Strings | 文字または文字列を比較する。 | |
| 4.6 Conversion of Characters and Strings | 文字から文字列、文字から文字列への変換。 | |
| 4.7 Formatting Strings | format:
printfのEmacsバージョン。
| |
| 4.8 Case Conversion in Lisp | 大文字小文字変換関数。 | |
| 4.9 The Case Table | 大文字小文字変換のカスタマイズ。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
文字(character)とは、テキスト内の1つの文字を表すLispオブジェクトです。Emacs Lispでは、文字は単なる整数です。ある整数が文字か文字でないかを区別するのは、それが使用される方法だけです。Emacsでの文字表現についての詳細は、Character Codesを参照してください。
文字列(string)とは、固定された文字シーケンスです。これは配列(array)と呼ばれるシーケンス型で、配列長が固定で、1度作成したら変更できないことを意味します(Sequences, Arrays, and Vectorsを参照してください)。Cとは異なり、Emacs Lispの文字列は文字コードを判断することにより終端されません。
文字列は配列であり、したがって同様にシーケンスでもあるので、Sequences, Arrays, and Vectorsにドキュメントされている一般的な配列関数やシーケンス関数で、文字列を処理できます。たとえば、文字列内の特定の文字にアクセスしたり変更することができますしかし表示された文字列の幅を計算するために、lengthを使用するべきではないことに注意してください。かわりにstring-widthを使用してください(Size of Displayed Textを参照してください)。
Emacs文字列での非ASCIIにたいすテキスト表現は2つ — ユニバイト(unibyte)とマルチバイト(multibyte)がありますほとんどのLispプログラミングでは、これら2つの表現を気にする必要はありません。詳細は、Text Representationsを参照してください。
キーシーケンスがユニバイト文字列で表されることがあります。ユニバイト文字列がキーシーケンスの場合、範囲128から255までの文字列要素は、範囲128から255の文字コードではなく、メタ文字(これは非常に大きな整数です)を表します。文字列はhyper、super、altで修飾された文字を保持できません。文字列はASCIIコントロール文字を保持できますが、それは他のコントロール文字です。文字列はASCIIコントロール文字の大文字小文字を区別できません。そのような文字をシーケンスに保存したい場合は、文字列ではなくベクターを使用しなければなりません。キーボード入力文字についての情報は、Character Typeを参照してください。
文字列は正規表現を保持するために便利です。string-match (Regular Expression Searchingを参照してください)を使用して、文字列にたいして正規表現をマッチすることもできます。関数match-string
(Simple Match Data Accessを参照してください)と、replace-match (see section Replacing the Text that Matched)は、文字列にたいして正規表現をマッチした後に、文字列を分解、変更するのに便利です。
バッファーのように、文字列は文字列内の文字自身と、その文字にたいするテキストプロパティーを含みます。Text Propertiesを参照してください。文字列からバッファーや他の文字列にテキストをコピーする、すべてのLispプリミティブ(Lisp primitives)は、コピーされる文字のプロパティーもコピーします。
文字列を表示したり、バッファーにコピーする関数についての情報は、Textを参照してください。文字または文字列の構文についての情報は、Character TypeとString Typeを参照してください。異なるテキスト表現間で変換したり、文字コードをエンコード、デコードする関数については、Non-ASCII Charactersを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
一般的なシーケンスや配列にたいする述語についての情報は、Sequences, Arrays, and Vectors、およびArraysを参照してください。
この関数はobjectが文字列の場合はt、それ以外はnilをreturnします。
この関数は、objectが文字列またはnilの場合はt、それ以外はnilをreturnします。
この関数は、objectが文字列または文字(たとえば整数)の場合はt、それ以外はnilをreturnします。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下の関数は、新たに文字列を作成したり、文字列同士を結合して文字列を作成したり、文字列の一部から文字列を作成する関数です。
この関数は、characterをcount回繰り返すことにより作成された文字列をreturnします。countが負の場合は、エラーをシグナルします。
(make-string 5 ?x)
⇒ "xxxxx"
(make-string 0 ?x)
⇒ ""
この関数に対応する他の関数にはmake-vector
(Vectorsを参照してください)、およびmake-list (Building Cons Cells and Listsを参照してください)が含まれます。
この関数は、文字charactersを含む文字列をreturnします。
(string ?a ?b ?c)
⇒ "abc"
この関数は、stringから、インデックスstartの文字(その文字を含む)から、endまでの文字(その文字は含まない)の範囲の文字から構成される、新しい文字列をreturnします。文字列の最初の文字がインデックス0になります。
(substring "abcdefg" 0 3)
⇒ "abc"
上記の例では、‘a’のインデックスは0、‘b’のインデックスは1、‘c’のインデックスは2です。インデックス3 —
この文字列の4番目の文字 —
は、部分文字列がコピーされる文字位置までをマークします。したがって文字列"abcdefg"から、‘abc’がコピーされます。
負のかすは、文字列の最後から数えることを意味するので、-1は文字列の最後の文字のインデックスです。たとえば:
(substring "abcdefg" -3 -1)
⇒ "ef"
この例では、‘e’のインデックスは-3、‘f’のインデックスは-2、‘g’のインデックスは-1です。したがって、‘e’と‘f’が含まれ、‘g’は含まれません。
endにnilが使用された場合、それは文字列の長さを意味します。したがって、
(substring "abcdefg" -3 nil)
⇒ "efg"
引数endを省略した場合、それはnilを指定したのと同じです。(substring string
0)は、stringのすべてをコピーしてreturnします。
(substring "abcdefg" 0)
⇒ "abcdefg"
しかし、この目的のためにはcopy-sequenceを推奨します(see section Sequences)。
stringからコピーされた文字がテキストプロパティーをもつ場合、そのプロパティーは新しい文字列へもコピーされます。Text Propertiesを参照してください。
substringの最初の引数にはベクターも指定できます。たとえば:
(substring [a b (c) "d"] 1 3)
⇒ [b (c)]
startが整数でない場合、またはendが整数でもnilでもない場合は、wrong-type-argumentエラーがシグナルされます。startがendの後の文字を指す場合、またはstringにたいして範囲外の整数をどちらかに指定した場合は、args-out-of-rangeエラーがシグナルされます。
この関数に対応するのはbuffer-substring (Examining Buffer Contentsを参照してください)で、これはカレントバッファー内のテキストの一部を含む文字列をreturnします。文字列の先頭はインデックス0ですが、バッファーの先頭はインデックス1です。
これはsubstringと同じようにL機能しますが、値からすべてのテキストプロパティーを破棄します。startを省略したり、nilを指定することができ、この場合0に等しくなります。したがって(substring-no-properties string)は、すべてのテキストプロパティーが削除されたstringのコピーをreturnします。
この関数は、渡された引数内の文字からなる、新しい文字列をreturnします(もしあればテキストプロパティーも)。引数には文字列、数のリスト、数のベクターを指定できます。引数は変更されません。concatに引数を指定しない場合、空文字列をreturnします。
(concat "abc" "-def")
⇒ "abc-def"
(concat "abc" (list 120 121) [122])
⇒ "abcxyz"
;; nilhあ空のシーケンス。
(concat "abc" nil "-def")
⇒ "abc-def"
(concat "The " "quick brown " "fox.")
⇒ "The quick brown fox."
(concat)
⇒ ""
この関数は常に、任意の既存の文字列にたいしてeqではない、新しい文字列を構築しますが、結果が空文字列の時は例外です(スペースを省くために、Emacsは空のマルチバイト文字列を1つだけ作成します)。
他の結合関数(concatenation functions)についての情報は、Mapping Functionsのmapconcat、Functions for Vectorsのvconcat、Building Cons Cells and Listsのappendを参照してください。シェルコマンドで使用される文字列の中に、個々のコマンドライン引数を結合するには、combine-and-quote-stringsを参照してください。
この関数は、正規表現separators(Regular Expressionsを参照してください)にもとづいて、stringを部分文字列に分解します。separatorsにたいする各マッチは、分割位置を定義します。分割位置の間にある部分文字列を、リストにまとめてreturnします。
omit-nullsがnil(または省略)の場合、連続する2つのseparatorsへのマッチ、またはstringの最初か最後にマッチしたときの空文字列が結果に含まれます。omit-nullsがtの場合、これらの空文字列は結果から除外されます。
separatorsがnil(または省略)の場合、デフォルトはsplit-string-default-separatorsの値になります。
特別なケースとして、separatorsがnil(または省略)の場合、常に結果から空文字列が除外されます。したがって:
(split-string " two words ")
⇒ ("two" "words")
結果は、ほとんど有用ではないであろう("" "two" "words"
"")という結果ではありません。このような結果が必要な時は、separatorsに明示的な値を使用します:
(split-string " two words "
split-string-default-separators)
⇒ ("" "two" "words" "")
他にも例を示します:
(split-string "Soup is good food" "o")
⇒ ("S" "up is g" "" "d f" "" "d")
(split-string "Soup is good food" "o" t)
⇒ ("S" "up is g" "d f" "d")
(split-string "Soup is good food" "o+")
⇒ ("S" "up is g" "d f" "d")
空のマッチはカウントされます。例外は、空でないマッチを使用することにより、すでに文字列の最後に到達しているとき、またはstringが空の時で、この場合split-stringは最後の空マッチを探しません。
(split-string "aooob" "o*")
⇒ ("" "a" "" "b" "")
(split-string "ooaboo" "o*")
⇒ ("" "" "a" "b" "")
(split-string "" "")
⇒ ("")
しかし、separatorsが空文字列にマッチできるとき、通常はomit-nullsはtにすれば、前の3つの例の不明瞭さは、ほとんど発生しません:
(split-string "Soup is good food" "o*" t)
⇒ ("S" "u" "p" " " "i" "s" " " "g" "d" " " "f" "d")
(split-string "Nice doggy!" "" t)
⇒ ("N" "i" "c" "e" " " "d" "o" "g" "g" "y" "!")
(split-string "" "" t)
⇒ nil
空でないマッチより空のマッチを優先するような、一部の“非貪欲(non-greedy)”な値をseparatorsに指定することにより、幾分奇妙(しかし予見可能)な振る舞いが発生する場合があります。繰り返しますが、そのような値は実際にはまれです:
(split-string "ooo" "o*" t)
⇒ nil
(split-string "ooo" "\\|o+" t)
⇒ ("o" "o" "o")
オプションの引数trimが非nilの場合、その値は各部分文字列の最初と最後からトリムするテキストにマッチする正規表現を指定します。トリムにより、その部分文字列が空になるような場合、それは空文字列として扱われます。
文字列を分割して、call-processやstart-processに適した、個々のコマンドライン引数のリストにする必要がある場合は、split-string-and-unquoteを参照してください。
split-stringのseparatorsにたいするデフォルト値です。通常の値は、"[ \f\t\n\r\v]+"です。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
既存の文字列の内容を変更するもっとも基本的な方法は、aset (see section Functions that Operate on Arrays)を使用する方法です。(aset string idx
char)は、stringのインデックスidxに、charを格納します。それぞれの文字は1文字以上を占有しますが、すでにインデックスの場所にある文字のバイト数が、charが要するバイト数と異なる場合、asetはエラーをシグナルします。
より強力な関数はstore-substringです:
この関数は、インデックスidxで開始される位置にobjを格納することにより、文字列stringの内容の一部を変更します。objは文字、または(stringより小さい)文字列です。
既存の文字列の長さを変更するのは不可能なので、stringの実際の長さにobjが収まらない場合、またはstringのその位置に現在ある文字のバイト数が、新しい文字に必要なバイト数と異なる場合はエラーになります。
パスワードを含む文字列をクリアーするときは、clear-stringを使用します:
これはstringをユニバイト文字列として、内容を0にクリアーします。これによりstringの長さも変更されるでしょう。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この関数は引数が同じ文字を表す場合はt、それ以外はnilをreturnします。case-fold-searchが非nilの場合、この関数は大文字小文字の違いを無視します。
(char-equal ?x ?x)
⇒ t
(let ((case-fold-search nil))
(char-equal ?x ?X))
⇒ nil
この関数は、2つの文字列の文字が正確にマッチする場合は、tをreturnします。引数にシンボルを指定することもでき、この場合はシンボル名が使用されます。case-fold-searchとは無関係に、大文字小文字は常に意味をもちます。
この関数は、equalで2つの文字列を比較するのと等価です(Equality Predicatesを参照してください)。特に、2つの文字列のテキストプロパティーは無視されます。テキストプロパティーだけが異なる文字列を区別する必要がある場合は、equal-including-propertiesを使用します。しかしequalとは異なり、どちらかの引数が文字列でもシンボルでもない場合、string=はエラーをシグナルします。
(string= "abc" "abc")
⇒ t
(string= "abc" "ABC")
⇒ nil
(string= "ab" "ABC")
⇒ nil
技術的な理由により、ユニバイト文字列とマルチバイト文字列がequalなのは、それらが同じ文字コードのシーケンスを含み、それらすべてのコードが0から127(ASCII)か、160から255(eight-bit-graphic)のときだけです。しかしユニバイト文字列をマルチバイト文字列に変更する際、コードが160から255の範囲にあるすべての文字はより高いコードに変換され、ASCII文字は変換されないまま残ります。したがってユニバイト文字列と、それを変換したマルチバイト文字列は、その文字列のすべてがASCIIのときだけequalです。マルチバイト文字列中で、もし文字コード160から255の文字があったとしても、それは完全に正しいとは言えません。結果として、すべてがASCIIではないユニバイト文字列とマルチバイト文字列がequalであるという状況は、もしかしたらEmacs
Lispプロプラマーが直面するかもしれない、とても希少な偽術的に不可解な状況だといえます。Text Representationsを参照してください。
string-equalはstring=に対する別名です。
この関数は、2つの文字列を1文字づつ比較します。この関数は、同時に2つの文字列をスキャンして、対応する文字同士がマッチしない最初のペアを探します。2つの文字列内で、小さいほうの文字がstring1の文字の場合、string1が小さいことになり、この関数はtをreturnします。小さいほうの文字がstring2の文字の場合、string1が大きいことになり、この関数はnilをreturnします。2つの文字列が完全にマッチした場合、値はnilになります。
文字のペアは、文字コードで比較されます。ASCII文字セットでは、小文字英字は大文字英字より、高い数値をもつことに留意してください。数字および多くの句読点文字は、大文字英字より低い数値をもちます。ASCII文字は、任意の非ASCII文字より小さくなります。ユニバイト非ASCII文字は、任意のマルチバイト非ASCII文字より、常に小さくなります(Text Representationsを参照してください)。
(string< "abc" "abd")
⇒ t
(string< "abd" "abc")
⇒ nil
(string< "123" "abc")
⇒ t
文字列の長さが異なり、string1の長さまでマッチする場合、結果はtになります。string2の長さまでマッチする場合、結果はnilになります。文字を含まない文字列は、他の任意の文字列より小さくなります。
(string< "" "abc")
⇒ t
(string< "ab" "abc")
⇒ t
(string< "abc" "")
⇒ nil
(string< "abc" "ab")
⇒ nil
(string< "" "")
⇒ nil
引数としてシンボルを指定することもでき、この場合はシンボルのプリント名が使用されます。
string-lesspはstring<にたいする別名です。
この関数は、string1がstring2のプレフィクス(接頭辞)の場合(たとえばstring2がstring1で始まる場合)、非nilをreturnします。オプションの引数ignore-caseが非nilの場合、比較において大文字小文字の違いは無視されます。
この関数は、suffixがstringのサフィックス(接尾辞)の場合(たとえばstringがsuffixで終わる場合)、非nilをreturnします。オプションの引数ignore-caseが非nilの場合、比較において大文字小文字の違いは無視されます。
この関数は、string1の指定された部分を、string2の指定された部分と比較します。string1の指定された部分とは、インデックスstart1(その文字を含む)から、インデックスend1(その文字を含まない)までです。start1にnilを指定すると文字列の最初という意味になり、end1にnilを指定すると文字列の長さを意味します同様に、string2の指定された部分とは、インデックスstart2からインデックスend2までです。
文字列は、文字列内の文字の数値により比較されます。たとえば、str1とstr2は、最初に異なる文字でstr1の文字の数値が小さいときに、“小さい”と判断されます。ignore-caseが非nilの場合、文字は比較を行なう前に小文字に変換されます。比較のためにユニバイト文字列はマルチバイト文字列に変換されるので(Text Representationsを参照してください)、ユニバイト文字列と、それを変換したマルチバイト文字列は、常に等しくなります。
2つの文字列の指定された部分がマッチした場合、値はtになります。それ以外では、値は整数で、これは何文字が一致して、どちらの文字が小さいかを示します。この値の絶対値は、2つの文字列の先頭から一致した文字数に1加えた値になります。string1(または指定された部分)のほうが小さい場合、符号は負になります。
この関数はassocと同様に機能しますが、keyは文字列かシンボルでなければならず、比較はcompare-stringsを使用して行なわれます。テストする前にシンボルは文字列に変換されます。case-foldが非nilの場合、大文字小文字の違いは無視されます。assocとは異なり、この関数はコンスではない文字列またはシンボルのalist要素もマッチできます。特に、alistは実際のalistではなく、文字列またはリストでも可能です。Association Listsを参照してください。
バッファー内のテキストを比較する方法として、Comparing Textの関数compare-buffer-substringsも参照してください。文字列にたいして正規表現のマッチを行なう関数string-matchも、ある種の文字列比較に使用することができます。Regular Expression Searchingを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは文字、文字列、整数の間で変換を行なう関数を説明します。format (Formatting Stringsを参照してください)、およびprin1-to-string (Output Functionsを参照してください)も、Lispオブジェクトを文字列に変換できます。read-from-string
(Input Functionsを参照してください)は、Lispオブジェクトの文字列表現を、オブジェクトに“変換”できます。関数string-to-multibyteおよびstring-to-unibyteは、テキスト表現を文字列に変換します(Converting Text Representationsを参照してください)。
テキスト文字と一般的なインプットイベントにたいするテキスト説明を生成する関数(single-key-descriptionおよびtext-char-description)については、Documentationを参照してください。これらの関数は主にヘルプメッセージを作成するために使用されます。
この関数はnumberの10進プリント表現からなる文字列をreturnします。引数が負の場合、return値はマイナス記号から開始されます。
(number-to-string 256)
⇒ "256"
(number-to-string -23)
⇒ "-23"
(number-to-string -23.5)
⇒ "-23.5"
int-to-stringは、この関数にたいする半ば廃れた(semi-obsolete)エイリアスです。
Formatting Stringsの関数formatも参照してください。
この関数はstring内の文字の数値的な値をreturnします。baseが非nilの場合、値は2以上16以下でなければならず、整数はその基数に変換されます。baseがnilの場合、基数に10が使用されます。浮動少数の変換は基数が10のときだけ機能します。わたしたちは浮動小数点数にたいして他の基数を実装していません。なえならこれには多くの作業が必要で、その割にその機能が有用には思えないからです。stringが整数のように見えるが、その値がLispの整数に収まらないほど大きな値の場合、string-to-numberは浮動小数の結果をreturnします。
解析ではstringの先頭にあるスペースとタブはスキップして、それから与えられた基数で数字として解釈できるところまでstringを読み取ります(スペースとタブだけではなく、先頭にある他の空白文字を無視するシステムもあります)。stringを数字として解釈できない場合、この関数は0をreturnします。
(string-to-number "256")
⇒ 256
(string-to-number "25 is a perfect square.")
⇒ 25
(string-to-number "X256")
⇒ 0
(string-to-number "-4.5")
⇒ -4.5
(string-to-number "1e5")
⇒ 100000.0
string-to-intは、この関数にたいする半ば廃れたエイリアスです。
この関数は、1つの文字characterを含む新しい文字列をreturnします。関数stringのほうがより一般的なので、この関数は半ば廃れています。Creating Stringsを参照してください。
この関数は、stringの最初の文字をreturnします。これはほとんど(aref string
0)と同じで、例外は文字列が空のときに0をreturnすることです(文字列の最初の文字がASCIIコード0のヌル文字のときも、0をreturnします)。この関数は、残すのに充分なほど有用と思えない場合、将来削除されるかもしれません。
以下は、文字列へ/からの変換に使用できる、その他の関数です:
concatこの関数はベクターまたはリストから文字列に変換します。Creating Stringsを参照してください。
vconcatこの関数は文字列をベクターに変換します。Functions for Vectorsを参照してください。
appendこの関数は文字列をリストに変換します。Building Cons Cells and Listsを参照してください。
byte-to-stringこの関数は文字データのバイトをユニバイト文字列に変換します。Converting Text Representationsを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
フォーマット(formatting)とは、定数文字列内のなまざまな場所を、計算された値で置き換えることにより、文字列を構築することを意味します。この定数文字列は、他の値がプリントされる方法、同様にどこに表示するかを制御します。これはフォーマット文字列(format string)と呼ばれます。
フォーマットは、表示されるメッセージを計算するために便利なことがしばしばあります。実際に、関数messageおよびerrorは、ここで説明する機能と同じフォーマットを提供します。これらの関数とformatの違いは、フォーマットされた結果を使用する方法だけです。
この関数は、stringをコピーしてから、対応するobjectsをエンコードする、コピー内の任意のフォーマット指定(format specification)を置換することにより作成される、新しい文字列をreturnします。引数objectsは、フォーマットされる計算された値です。
string内のフォーマット指定以外の文字は、(もしあれば)テキストプロパティーを含め、出力に直接コピーされます。
フォーマット指定は、‘%’で始まる文字シーケンスです。したがってstring内に‘%d’があれば、formatはそれを、フォーマットされる値の1つ(引数objectsのうちの1つ)にたいするプリント表現で置き換えます。たとえば:
(format "The value of fill-column is %d." fill-column)
⇒ "The value of fill-column is 72."
formatは文字‘%’をフォーマット指定と解釈するので、決して最初の引数に不定な文字列(arbitrary
string)を渡すべきではありません。これは特に何らかのLispコードにより生成された文字列の場合に当てはまります。その文字列が決して文字‘%’を含まないと確信できないときは、以下で説明するように最初の引数に"%s"を渡して、不定な文字列を2番目の引数として渡します:
(format "%s" arbitrary-string)
stringに複数のフォーマット指定が含まれる場合、フォーマット指定はobjectsから連続して値を引き当てます。つまり、string内の1番目のフォーマット指定は1番目の値、2番目のフォーマット指定は2番目の値、...を使用します。余分なフォーマット指定(対応する値がない場合)は、エラーとなります。フォーマットされる値が余分にある場合は、無視されます。
ある種のフォーマット指定は、特定の型の値を要求します。その要求に適合しない値を与えた場合、エラーがシグナルされます。
以下は有効なフォーマット指定の表です:
フォーマット指定を、クォートなし(つまりprin1ではなくprincを使用して。Output Functionsを参照してください)の、オブジェクトのプリント表現で置き換えます。したがって、文字列は‘"’文字なしの、文字列内容だけが表示され、シンボルは‘\’文字なしで表されます。
オブジェクトが文字列の場合、文字列のプロパティーは出力にコピーされます。‘%s’のテキストプロパティー自身もコピーされますが、オブジェクトのテキストプロパティーが優先されます。
フォーマット指定を、クォートあり(つまりprin1を使用して。Output Functionsを参照してください)の、オブジェクトのプリント表現で置き換えます。したがって、文字列は‘"’文字で囲まれ、必要となる特別文字の前に‘\’文字が表示されます。
フォーマット指定を8進表現の整数で置き換えます。
フォーマット指定を10進表現の整数で置き換えます。
フォーマット指定を16進表現の整数で置き換えます。‘%x’の場合は小文字、‘%X’の場合は大文字が使用されます。
フォーマット指定を、与えられた値の文字で置き換えます。
フォーマット指定を、浮動小数点数の指数表現で置き換えます。
フォーマット指定を、浮動小数点数にたいする10進少数表記で置き換えます。
フォーマット指定を、指数または10進少数のどちらか短いほうの表記を使用した浮動小数点数で置き換えます。
フォーマット指定を1つの‘%’で置き換えます。このフォーマット指定は、値を使用しません。たとえば、(format "%% %d"
30)は"% 30"をreturnします。
他のフォーマット文字は、‘Invalid format operation’エラーになります。
以下にいくつかの例を示します:
(format "The name of this buffer is %s." (buffer-name))
⇒ "The name of this buffer is strings.texi."
(format "The buffer object prints as %s." (current-buffer))
⇒ "The buffer object prints as strings.texi."
(format "The octal value of %d is %o,
and the hex value is %x." 18 18 18)
⇒ "The octal value of 18 is 22,
and the hex value is 12."
フォーマット指定はフィールド幅(width)をもつことができ、これは‘%’とフォーマット指定文字(specification
character)の間の10進の数字です。そのオブジェクトのプリント表現が、このフィールド幅より少ない文字で構成される場合、formatはパディングしてフィールド幅に拡張します。フォーマット指定‘%%’では、フィールド幅の指定は無視されます。シールド幅指定により行なわれるパディングは通常、左側にスペースを挿入します。
(format "%5d is padded on the left with spaces" 123)
⇒ " 123 is padded on the left with spaces"
フィールド幅が小さすぎる場合でも、formatはオブジェクトのプリント表現を切り詰めません。したがって、情報を失う危険を犯すことなく、フィールドの最小幅を指定することができます。以下の2つの例では、‘%7s’は最小幅に7を指定します。1番目の例では、‘%7s’に挿入される文字列は3文字だけなので、4つのブランクスペースによりパディングされます。2番目の例では、文字列"specification"は13文字ですが、切り詰めはされません。
(format "The word `%7s' has %d letters in it."
"foo" (length "foo"))
⇒ "The word ` foo' has 3 letters in it."
(format "The word `%7s' has %d letters in it."
"specification" (length "specification"))
⇒ "The word `specification' has 13 letters in it."
‘%’の直後、オプションのフィールド幅指定の前に、フラグ文字(flag characters)を置くこともできます。
フラグ‘+’は、正数の前にプラス符号を挿入するので、数には常に符号がつきます。フラグとしてスペースを指定すると、正数の前に1つのスペースが挿入されます(それ以外は、正数は最初の数字から開始されます)。これらのフラグは、正数と負数が同じ列数を使用することを確実にするのに便利です。これらは‘%d’、‘%e’、‘%f’、‘%g’以外では無視され、両方が指定された場合は、‘+’が優先されます。
フラグ‘#’は“代替形式(alternate form)”を指定し。これは使用するフォーマットに依存します。‘%o’にたいしては、結果を‘0’で開始させます。‘%x’と‘%X’にたいしては、結果のプレフィクスは‘0x’または‘0X’になります。‘%e’、‘%f’、‘%g’にたいしては、‘#’フラグは、少数部が0のときも小数点が含まれることを意味します。
フラグ‘0’は、スペースの代わりに文字‘0’でパディングします。このフラグは‘%s’、‘%S’、‘%c’のような、非数値のフォーマット指定文字では無視されます。もれらのフォーマット指定文字で‘0’フラグを指定できますが、それでもスペースでパディングされます。
フラグ‘-’はフィールド幅指定により挿入されるパディングに作用し、もしパディングがある場合、左側ではなく右側にパディングされます。‘-’と‘0’の両方が指定された場合、‘0’フラグは無視されます。
(format "%06d is padded on the left with zeros" 123)
⇒ "000123 is padded on the left with zeros"
(format "%-6d is padded on the right" 123)
⇒ "123 is padded on the right"
(format "The word `%-7s' actually has %d letters in it."
"foo" (length "foo"))
⇒ "The word `foo ' actually has 3 letters in it."
すべてのフォーマット指定文字には、その文字の前(フィールド幅がある場合は、その後)に、オプションで精度(precision)を指定できます。精度は小数点‘.’と、その後に桁文字列(digit-string)を指定します。浮動少数のフォーマット指定(‘%e’、‘%f’、‘%g’)では、精度は表示する小数点以下の桁数を指定します。0の場合は小数点も省略されます。‘%s’と‘%S’にたいしては、文字列を精度で指定された幅に切り詰めます。したがって‘%.3s’では、objectにたいするプリント表現の最初の3文字だけが表示されます。他のフォーマット指定文字にたいしては、精度は効果がありません。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
大文字小文字変換関数(character case functions)は、1つの文字または文字列の内容の大文字小文字を変換します。関数は通常、アルファベット文字(英字‘A’から‘Z’と‘a’から‘z’、同様に非ASCIIの英字)だけを変換し、それ以外の文字は変換しません。大文字小文字テーブル(case table。The Case Tableを参照してください)で指定することにより大文字小文字の変換に異なるマッピングを指定できます。
これらの関数は、引数として渡された文字列は変更しません。
以下の例では文字‘X’と‘x’を使用し、これらのASCIIコードは88と120です。
この関数は、string-or-char(文字か文字列)を小文字に変換します。
string-or-charが文字列の場合、この関数は引数の大文字を小文字に変換した、新しい文字列をreturnします。string-or-charが文字の場合、この関数は対応する小文字(正数)をreturnします。元の文字が小文字の場合、または英字でない場合、return値は元の文字と同じです。
(downcase "The cat in the hat")
⇒ "the cat in the hat"
(downcase ?X)
⇒ 120
この関数は、string-or-char(文字か文字列)を大文字に変換します。
string-or-charが文字列の場合、この関数は引数の小文字を大文字に変換した、新しい文字列をreturnします。string-or-charが文字の場合、この関数は対応する大文字(正数)をreturnします。元の文字が大文字の場合、または英字でない場合、return値は元の文字と同じです。
(upcase "The cat in the hat")
⇒ "THE CAT IN THE HAT"
(upcase ?x)
⇒ 88
この関数は文字列または文字をキャピタライズ(capitalize: 先頭が大文字で残りは小文字)します。この関数は、string-or-charが文字列の場合、string-or-charの各単語がキャピタライズされた新しいコピーをreturnします。これは各単語の最初の文字が大文字に変換され、残りは小文字に変換されることを意味します。
単語の定義は、カレント構文テーブル(current syntax table)の単語構成構文クラス(word constituent syntax class)に割り当てられた、連続する文字の任意シーケンスです(Table of Syntax Classesを参照してください)。
string-or-charが文字の場合、この関数はupcaseと同じことを行ないます。
(capitalize "The cat in the hat")
⇒ "The Cat In The Hat"
(capitalize "THE 77TH-HATTED CAT")
⇒ "The 77th-Hatted Cat"
(capitalize ?x)
⇒ 88
この関数は、string-or-charが文字列の場合、string-or-charの中の単語の頭文字をキャピタライズし、頭文字以外の文字は変更しません。この関数は、string-or-charの各単語の頭文字が大文字に変換された新しいコピーをreturnします。
単語の定義は、カレント構文テーブル(current syntax table)の単語構成構文クラス(word constituent syntax class)に割り当てられた、連続する文字の任意シーケンスです(Table of Syntax Classesを参照してください)。
upcase-initialsの引数が文字の場合、upcase-initialsの結果はupcaseと同じになります。
(upcase-initials "The CAT in the hAt")
⇒ "The CAT In The HAt"
文字列を比較する関数(大文字小文字の違いを無視するものや、オプションで大文字小文字の違いを無視できるもの)については、Comparison of Characters and Stringsを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
特別な大文字小文字テーブル(case table)をインストールすることにより、大文字小文字の変換をカスタマイズできます。大文字小文字テーブルは大文字と小文字の間のマッピングを指定します。大文字小文字テーブルはLispオブジェクトにたいする大文字小文字変換関数(前のセクションを参照してください)と、バッファー内のテキストに適用される関数の両方に影響します。それぞれのバッファーには大文字小文字テーブルがあります。新しいバッファーの大文字小文字テーブルを初期化するために使用される、標準の大文字小文字テーブル(standard case table)もあります。
大文字小文字テーブルは、サブタイプがcase-tableの文字テーブル(char-table。Char-Tablesを参照してください)です。この文字テーブルは、それぞれの文字を対応する小文字にマップします。大文字小文字テーブルは、関連するテーブルを保持する、3つの追加スロットをもちます:
upcase(大文字)テーブルは、それぞれの文字を対応する大文字にマップします。
canonicalize(正準化)テーブルは、大文字小文字に関連する文字セットのすべてを、その文字セットの特別なメンバーにマップします。
equivalence(同値)テーブルは、大の字小文字に関連した文字セットのそれぞれを、そのセットの次の文字にマップします。
単純な例では、小文字へのマッピングを指定することだけが必要です。3つの関連するテーブルは、このマッピングから自動的に計算されます。
大文字と小文字が1対1で対応しない言語もいくつかあります。これらの言語では、2つの異なる小文字が、同じ大文字にマップされます。このような場合、大文字と小文字の両方にたいするマップを指定する必要があります。
追加のcanonicalizeテーブルは、それぞれの文字を、正準化された等価文字にマップします。大文字小文字に関連する任意の2文字は、同じ正準等価文字(canonical equivalent character)をもちます。たとえば‘a’と‘A’は大文字小文字変換に関係があるので、これらの文字は同じ正準等価文字(両方の文字が‘a’、または両方の文字が‘A’)をもつべきです。
追加のequivalencesテーブルは、各等価クラスの文字(同じ正準等価文字をもつ文字)を循環的にマップします(通常のASCIIでは、これは‘a’を‘A’に‘A’を‘a’にマップし、他の等価文字セットにたいしても同様にマップします)。
大文字小文字テーブルを構築する際は、canonicalizeにnilを指定できます。この場合、Emacsは大文字と小文字のマッピングで、このスロットを充填します。equivalencesにたいしてnilを指定することもできます。この場合、Emacsはcanonicalizeから、このスロットを充填します。実際に使用される大文字小文字テーブルでは、これらのコンポーネントは非nilです。canonicalizeを指定せずにequivalencesを指定しないでください。
以下は大文字小文字テーブルに作用する関数です:
この述語は、objectが有効な大文字小文字テーブルの場合は、非nilをreturnします。
この関数は、tableを標準大文字小文字テーブルにして、これ以降に作成される任意のバッファーにたいしてこのテーブルが使用されます。
これは標準大文字小文字テーブル(standard case table)をreturnします。
この関数は、カレントバッファーの大文字小文字テーブルをreturnします。
これはカレントバッファーの大文字小文字テーブルを、tableにセットします。
with-case-tableマクロはカレント大文字小文字テーブルを保存してから、tableをカレント大文字小文字テーブルにセットし、その後にbodyフォームを評価してから、最後に大文字小文字テーブルをリストアします。return値は、bodyの最後のフォームの値です。throwまたはエラー(Nonlocal Exitsを参照してください)により異常終了した場合でも、大文字小文字テーブルはリストアされます。
ASCII文字の大文字小文字変換を変更する言語環境(language
environment)がいくつかあります。たとえばTurkishの言語環境では、ASCII文字の‘I’にたいする小文字は、Turkishの“dotless
i”です。これは、(ASCIIベースのネットワークプロトコル実装のような)ASCIIの通常の大文字小文字変換を要求するコードに干渉する可能性があります。このような場合は、変数ascii-case-tableにたいしてwith-case-tableマクロを使用します。これにより、変更されていないASCII文字セットの大文字小文字テーブルが保存されます。
ASCII文字セットにたいする大文字小文字テーブルです。すべての言語環境セッティングにおいて、これを変更するべきではありません。
以下の3つの関数は、非ASCII文字セットを定義するパッケージにたいして便利なサブルーチンです。これらはcase-tableに指定された大文字小文字テーブルを変更します。これは標準構文テーブルも変更します。Syntax Tablesを参照してください。通常これらの関数は、標準大文字小文字テーブルを変更するために使用されます。
この関数は、対応する文字のペア(一方は大文字、もう一方は小文字)を指定します。
この関数は文字lとrを、大文字小文字不変区切り(case-invariant delimiter)mpマッチングペアにします。
この関数はcharを、構文syntaxの、大文字小文字不変(case-invariant)とします。
このコマンドは、カレントバッファーの大文字小文字テーブルの内容にたいする説明を表示します。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
リスト(list)は0個以上の要素(任意のLispオブジェクト)のシーケンスを表します。リストとベクターの重要な違いは、、2つ以上のリストが、構造の一部を共有できることです。加えて、リスト全体をコピーすることなく、要素の挿入、削除ができます。
| 5.1 Lists and Cons Cells | コンスセルからリストが作られる方法。 | |
| 5.2 Predicates on Lists | このオブジェクトはリストか? 2つのリストを比較する。 | |
| 5.3 Accessing Elements of Lists | リストの一部を抽出する。 | |
| 5.4 Building Cons Cells and Lists | リスト構造の作成。 | |
| 5.5 Modifying List Variables | 変数に保存されたリストにたいする変更。 | |
| 5.6 Modifying Existing List Structure | 既存のリストに新しい要素を保存する。 | |
| 5.7 Using Lists as Sets | リストは有限な数学集合を表現できます。 | |
| 5.8 Association Lists | リストは有限な関係またはマッピングを表現できます。 | |
| 5.9 Property Lists | 要素ペアのリスト |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lispでのリストは基本データ型ではありません。リストはコンスセル(cons cells)から構築されます(Cons Cell and List Typesを参照してください)。コンスセルは、順序つきペアを表現するデータオブジェクトです。つまり、コンスセルは2つのスロットをもち、それぞれのスロットはLispオブジェクトを保持(holds)、または参照(refers to)します。1つのスロットはCAR、もう1つはCDRです(これらの名前は歴史的なものです。Cons Cell and List Typesを参照してください)。CDRは“could-er(クダー)”と発音されます。
わたしたちは、コンスセルのCARスロットに現在保持されているオブジェクトが何であれ、“このコンスセルのCARは、...”のような言い方をします。これはCDRの場合も同様です。
リストとは、“互いにつながった(chained together)”一連のコンスセルであり、各セルは次のセルを参照します。リストの各要素にたいして、それぞれ1つのコンスセルがあります。慣例により、コンスセルのCARはリストの要素を保持し、CDRはリストをチェーンするのに使用されます(CARとCDRの間の非対称性は完全に慣例的なものです。コンスセルのレベルでは、CARスロットとCDRスロットは同じようなプロパティーをもちます)。したがって、リスト内の各コンスセルのCDRスロットは、次のコンスセルを参照します。
これも慣例的なものですが、リスト内の最後のコンスセルのCDRはnilです。わたしたちは、このようなnilで終端された構造を、真リスト(true
list)と呼びます。Emacs
Lispでは、シンボルnilは、シンボルであり、要素なしのリストでもあります。便宜上、シンボルnilは、そのCDR(およびCAR)にnilをもつと考えます。
したがって真リストのCDRは、常に真リストです。空でない真リストのCDRは、1番目の要素以外を含む真リストです。
リストの最後のコンスセルのCDRがnil以外の何らかの値の場合、このリストのプリント表現はドットペア表記(dotted pair
notation。Dotted Pair Notationを参照してください)を使用するので、わたしたちはこの構造をドットリスト(dotted
list)と呼びます。他の可能性もあります。あるコンスセルのCDRが、そのリストのそれより前にある要素を指すかもしれません。わたしたちは、この構造を循環リスト(circular
list)と呼びます。
ある目的にたいしては、そのリストが真リストか、循環リストなのか、ドットリストなのかが問題にならない場合もあります。そのプログラムが、リストを充分に下って最後のコンスセルのCDRを確認しようとしないなら、これは問題になりません。しかし、リストを処理するの関数のいくつかは、真リストを要求し、ドットリストの場合はエラーをシグナルします。リストの最後を探そうと試みる関数のほとんどは、循環リストを与えると無限ループに突入します。
ほとんどのコンスセルはリストの一部として使用されるので、わたしたちはコンスセルで構成される任意の構造を、リスト構造(list structure)と呼びます。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下の述語は、あるLispオブジェクトがアトムなのか、コンスセルなのか、それともリストなのか、またはオブジェクトがnilかどうかテストします(これらの述語の多くは、他の述語で定義することもできますが、多用されるので、定義する価値があるのです)。
この関数は、objectがコンスセルの場合はt、それ以外はnilをreturnします。たとえnilはリストですが、コンスセルではありません。
この関数は、objectがアトムの場合はt、それ以外はnilをreturnします。シンボルnilはアトムであり、リストでもあります。そのようなLispオブジェクトはnilだけです。
(atom object) ≡ (not (consp object))
この関数は、objectがコンスセルかnilの場合はtをreturnします。それ以外はnilをreturnします。
(listp '(1))
⇒ t
(listp '())
⇒ t
この関数はlistpの反対です。objectがリストでない場合はtをreturnします。それ以外はnilをreturnします。
(listp object) ≡ (not (nlistp object))
この関数は、objectがnilの場合はt、それ以外はnilをreturnします。この関数はnotと等価ですが、明解にするために、objectをリストだと考えるときはnull、真偽値だと考えるときはnotを使用します(Constructs for Combining Conditionsのnotを参照してください)。
(null '(1))
⇒ nil
(null '())
⇒ t
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この関数は、コンスセルcons-cellの1番目のスロットにより参照される値をreturnします。他の言い方をすると、この関数はcons-cellのCARをreturnします。
特別なケースとして、cons-cellがnilの場合、この関数はnilをreturnします。したがって、リストはすべて引数として有効です。引数がコンスセルでもnilでもない場合、エラーがシグナルされます。
(car '(a b c))
⇒ a
(car '())
⇒ nil
この関数は、コンスセルcons-cellの2番目のスロットにより参照される値をreturnします。他の言い方をすると、この関数はcons-cellのCDRをreturnします。
特別なケースとして、cons-cellがnilの場合、この関数はnilをreturnします。したがって、リストはすべて引数として有効です。引数がコンスセルでもnilでもない場合、エラーがシグナルされます。
(cdr '(a b c))
⇒ (b c)
(cdr '())
⇒ nil
この関数により、他のデータ型によるエラーを起こさずに、コンスセルのCARを取得できます。この関数は、objectがコンスセルの場合はobjectのCAR、それ以外はnilをreturnします。この関数は、objectがリスとでないときはエラーをシグナルするcarとは対象的です。
(car-safe object)
≡
(let ((x object))
(if (consp x)
(car x)
nil))
この関数により、他のデータ型によるエラーを起こさずに、コンスセルのCDRを取得できます。この関数は、objectがコンスセルの場合はobjectのCDR、それ以外はnilをreturnします。この関数は、objectがリスとでないときはエラーをシグナルするcdrとは対象的です。
(cdr-safe object)
≡
(let ((x object))
(if (consp x)
(cdr x)
nil))
このマクロはリストのCARを調べて、それをリストから取り去るのを1度に行なう便利な方法を提供します。この関数はlistnameに格納されたリストにたいして処理を行ないます。この関数はリストから1番目の要素を削除して、CDRをlistnameに保存し、その後で削除した要素をreturnします。
1番単純なケースは、リストに名前をつけるためのクォートされていないシンボルの場合です。この場合、このマクロは(prog1 (car listname) (setq listname (cdr listname)))と等価です。
x
⇒ (a b c)
(pop x)
⇒ a
x
⇒ (b c)
より一般的なのは、listnameが汎変数(generalized
variable)の場合です。この場合、このマクロはsetfを使用してlistnameに保存します。Generalized Variablesを参照してください。
リストに要素を追加するpushマクロについては、Modifying List Variablesを参照してください。
この関数は、listのn番目の要素をreturnします。要素は0から数えられるので、listのCARは要素0になります。listの長さがn以下の場合、値はnilです。
(nth 2 '(1 2 3 4))
⇒ 3
(nth 10 '(1 2 3 4))
⇒ nil
(nth n x) ≡ (car (nthcdr n x))
関数eltは似ていますが、これは任意の種類のシーケンスに適用されます。歴史的な理由により、この関数は逆の順序で引数を受け取ります。Sequencesを参照してください。
この関数は、listのn番目のCDRをreturnします。他の言い方をすると、この関数はlistの最初のn個のリンクをスキップしてから、それ以降をreturnします。
nが0の場合、nthcdrはlist全体をreturnします。listの長さがn以下の場合、nthcdrはnilをreturnします。
(nthcdr 1 '(1 2 3 4))
⇒ (2 3 4)
(nthcdr 10 '(1 2 3 4))
⇒ nil
(nthcdr 0 '(1 2 3 4))
⇒ (1 2 3 4)
この関数は、listの最後のリンクをreturnします。このリンクのcarは、このリストの最後の要素です。listがnullの場合、nilがreturnされます。nが非nilの場合、n番目から最後までのリンクがreturnされます。nがlistの長さより大きい場合は、list全体がreturnされます。
この関数は、エラーや無限ループの危険なしで、listの長さをreturnします。この関数は一般的に、リスト内のコンスセルの個数をreturnします。しかし循環リストでは、単に上限値が値となるため、非常に大きくなる場合があります。
listがnilでもコンスセルでもない場合、safe-lengthは0をreturnします。
循環リストを考慮しなくてもよい場合に、リストの長さを計算するもっとも一般的な方法は、lengthを使うことです。Sequencesを参照してください。
これは、(car (car cons-cell))と同じです。
これは、(car (cdr cons-cell))または(nth 1
cons-cell)と同じです。
これは、(cdr (car cons-cell))と同じです。
これは、(cdr (cdr cons-cell))または(nthcdr 2
cons-cell)と同じです。
この関数は、リストxから、最後の要素、または最後のn個の要素を削除してreturnします。nが0より大きい場合、この関数はリストのコピーを作成するので、元のリストに影響はありません。一般的に、(append
(butlast x n) (last x
n))は、xと等しいリストをreturnします。
この関数は、リストのコピーを作成するのではなく、cdrを適切な要素に変更することにより破壊的に機能するバージョンのbutlastです。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
リストはLispの核にあるので、リストを構築する多くの関数があります。consはリストを構築する基本的な関数です。しかしEmacsのソースコードでは、consよりlistのほうが多く使用されているのは興味深いことです。
この関数は、新しいリスト構造を構築するための、もっとも基本的な関数です。この関数は、object1をCAR、object2をCDRとする、新しいコンスセルを作成して、それから新しいコンスセルをreturnします。引数object1とobject2は、任意のLispオブジェクトを指定できますが、ほとんどの場合、object2はリストです。
(cons 1 '(2))
⇒ (1 2)
(cons 1 '())
⇒ (1)
(cons 1 2)
⇒ (1 . 2)
リストの先頭に1つの要素を追加するために、consがよく使用されます。これは、リストに要素をコンスすると言います。2たとえば:
(setq list (cons newelt list))
この例で使用されているlistという名前の変数と、以下で説明するlistという名前の関数は、競合しないことに注意してください。任意のシンボルは、両方の役割を果たすことができます。
この関数は、objectsを要素とするリストを作成します。結果となるリストは、常にnil終端されます。objectsを指定しない場合、空リストがreturnされます。
(list 1 2 3 4 5)
⇒ (1 2 3 4 5)
(list 1 2 '(3 4 5) 'foo)
⇒ (1 2 (3 4 5) foo)
(list)
⇒ nil
この関数は、各要素がobjectの、length個の要素からなるリストを作成します。make-listとmake-string(Creating Stringsを参照してください)を比較してみてください。
(make-list 3 'pigs)
⇒ (pigs pigs pigs)
(make-list 0 'pigs)
⇒ nil
(setq l (make-list 3 '(a b)))
⇒ ((a b) (a b) (a b))
(eq (car l) (cadr l))
⇒ t
この関数は、sequencesのすべての要素を服務リストをreturnします。sequencesには、リスト、ベクター、ブールベクター、文字列も指定できますが、通常は最後にリストを指定するべきです。最後の引数を除くすべての引数はコピーされるので、変更される引数はありません(コピーを行なわずにリストを結合する方法については、Functions that Rearrange Listsのnconcを参照してください)。
より一般的には、appendにたいする最後の引数は、任意のLispオブジェクトかもしれません。最後の引数は、コピーまたは変換されません。最後の引数は、新しいリストの最後のコンスセルのCDRになります。最後の引数もリストならば、このリストの要素は、実質的には結果リストの要素になります。最後の要素がリストでない場合、最後のCDRが(真リストで要求される)nilではないので、結果はドットリストになります。
以下はappendを使用した例です:
(setq trees '(pine oak))
⇒ (pine oak)
(setq more-trees (append '(maple birch) trees))
⇒ (maple birch pine oak)
trees
⇒ (pine oak)
more-trees
⇒ (maple birch pine oak)
(eq trees (cdr (cdr more-trees)))
⇒ t
appendがどのように機能するか、ボックスダイアグラムで見ることができます。変数treesはリスト(pine
oak)にセットされ、それから変数more-treesにリスト(maple birch pine
oak)がセットされます。しかし変数treesは継続して元のリストを参照します:
more-trees trees
| |
| --- --- --- --- -> --- --- --- ---
--> | | |--> | | |--> | | |--> | | |--> nil
--- --- --- --- --- --- --- ---
| | | |
| | | |
--> maple -->birch --> pine --> oak
空のシーケンスは、appendによりreturnされる値に寄与しません。この結果、最後の引数にnilを指定すると、それより前の引数のコピーを強制することになります。
trees
⇒ (pine oak)
(setq wood (append trees nil))
⇒ (pine oak)
wood
⇒ (pine oak)
(eq wood trees)
⇒ nil
これは関数copy-sequenceが導入される以前は、リストをコピーする通常の方法でした。Sequences, Arrays, and Vectorsを参照してください。
以下は、appendの引数としてベクターと文字列を使用する例です:
(append [a b] "cd" nil)
⇒ (a b 99 100)
apply (Calling Functionsを参照してください)の助けを借りることにより、リストのリストの中の、すべてのリストをappendできます。
(apply 'append '((a b c) nil (x y z) nil))
⇒ (a b c x y z)
sequencesが与えられない場合、nilがreturnされます:
(append)
⇒ nil
以下は、最後の引数がリストでない場合の例です:
(append '(x y) 'z)
⇒ (x y . z)
(append '(x y) [z])
⇒ (x y . [z])
2番目の例は、最後の引数はシーケンスですがリスとではない場合で、このシーケンスの要素は、結果リストの要素にはなりません。かわりに、最後の引数がリストでないときと同様、シーケンスが最後のCDRになります。
この関数は、要素はlistの要素ですが、順序が逆の新しいリストを作成します。元の引数listは、変更されません。
(setq x '(1 2 3 4))
⇒ (1 2 3 4)
(reverse x)
⇒ (4 3 2 1)
x
⇒ (1 2 3 4)
この関数はツリーtreeのコピーをreturnします。treeがコンスセルの場合、同じCARとCDRをもつ新しいコンスセルを作成してから、同じ方法によりCARとCDRを再帰的にコピーします。
通常、treeがコンスセル以外の場合、copy-treeは単にtreeをreturnします。しかし、vecpが非nilの場合、この関数はベクターでもコピーします(そしてベクターの要素を再帰的に処理します)。
これは、fromからseparationづつインクリメントして、toの直前で終わる、数字のリストをreturnします。separationには正または負の数を指定でき、デフォルトは1です。toがnil、または数的にfromと等しい場合、値は1要素のリスト(from)になります。separationが正でtoがfromより小さい場合、またはseparationが負でtoがfromより大きい場合、これらの引数は空のシーケンスを指示することになるので、値はnilになります。
separationが0で、toがnilでもなく、数的にfromとも等しくない場合、これらの引数は無限シーケンスを指示することになるので、エラーがシグナルされます。
引数はすべて数字です。浮動少数の計算は正確ではないので、浮動少数の引数には用心する必要があります。たとえばマシンに依存して、(number-sequence
0.4 0.8 0.2)が3要素のリストをreturnするのに、(number-sequence 0.4 0.6
0.2)が1要素のリスト(0.4)をreturnすることがよく起こります。リストのn番目の要素は、厳密に(+
from (* n
separation))という式により計算されます。したがって、リストに確実にtoが含まれるようにするには、この式に適切な型のtoを渡すことができます。別の方法として、toを少しだけ大きな値(separationが負の場合は、少しだけ小さな値)に置き換えることもできます。
いくつか例を示します:
(number-sequence 4 9)
⇒ (4 5 6 7 8 9)
(number-sequence 9 4 -1)
⇒ (9 8 7 6 5 4)
(number-sequence 9 4 -2)
⇒ (9 7 5)
(number-sequence 8)
⇒ (8)
(number-sequence 8 5)
⇒ nil
(number-sequence 5 8 -1)
⇒ nil
(number-sequence 1.5 6 2)
⇒ (1.5 3.5 5.5)
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
これらの関数、および1つのマクロは、変数に格納されたリストを変更する便利な方法を提供します。
このマクロは、CARがelementで、CDRがlistnameで指定されたリストであるような新しいリストを作成して、そのリストをlistnameに保存します。単純なのは、listnameはリストに名前をつけるクォートされていないシンボルのときで、この場合マクロは(setq listname (cons element listname))と等価です。
(setq l '(a b))
⇒ (a b)
(push 'c l)
⇒ (c a b)
l
⇒ (c a b)
より一般的なのは、listnameが汎変数の場合です。この場合、このマクロは(setf listname (cons element listname))と等価です。Generalized Variablesを参照してください。
リストから1番目の要素を取り出すpopマクロについては、Accessing Elements of Listsを参照してください。
以下の2つの関数は、変数の値であるリストを変更します。
この関数は、elementがsymbolの値のメンバーでない場合は、symbolにelementをコンスすることにより、変数symbolをセットします。この関数は、リストが更新されているかに関わらず、結果のリストをreturnしますsymbolの値は、呼び出し前にすでにリストであることが望ましいです。elementがリストの既存メンバーか比較するために、add-to-listはcompare-fnを使用します。compare-fnがnilの場合は、equalを使用します。
elementが追加される場合は通常、symbolの前に追加されますが、オプションの引数appendが非nilの場合は、最後に追加されます。
引数symbolは、暗黙にクォートされません。setqとは異なり、add-to-listはsetのような通常の関数です。クォートしたい場合は自分で引数をクォートします。
以下はadd-to-listを使用する方法をシナリオで示します:
(setq foo '(a b))
⇒ (a b)
(add-to-list 'foo 'c) ;; cを追加。
⇒ (c a b)
(add-to-list 'foo 'b) ;; 効果なし。
⇒ (c a b)
foo ;; fooが変更された。
⇒ (c a b)
以下は(add-to-list 'var value)と等価な式です:
(or (member value var)
(setq var (cons value var)))
この関数は、古い値(リストでなければなりません)のorderで指定された位置に、elementを挿入することにより、変数symbolをセットします。elementがすでにこのリストのメンバーである場合、リスト内の要素の位置はorderにしたがって調整されます。メンバーかどうかは、eqを使用してテストされます。この関数は、更新されているかどうかに関わらず、結果のリストをreturnします。
orderは通常、数字(正数か浮動小数)で、リストの要素は、その数字の昇順で並べられます。
orderを省略またはnilにすることもできます。これにより、リストにelementがすでに存在する場合、elementの数字順序は変更されません。それ以外では、elementは数字順序をもちません。リストの数字順序をもたない要素は、リストの最後に配され、特別な順序はつきません。
orderに他の値を指定した場合、elementがすでに数字順序をもつときは数字順序が削除されます。それ以外は、nilと同じです。
引数symbolは、暗黙にクォートされません。add-to-ordered-listは、setqなどとは異なり、setのような通常の関数です。必要な場合は引数を自分でクォートしてください。
順序の情報は、symbolのlist-orderプロパティーのハッシュテーブルに保存されます。
以下にadd-to-ordered-listを使用する方法をシナリオで示します:
(setq foo '())
⇒ nil
(add-to-ordered-list 'foo 'a 1) ;; aを追加。
⇒ (a)
(add-to-ordered-list 'foo 'c 3) ;; cを追加。
⇒ (a c)
(add-to-ordered-list 'foo 'b 2) ;; bを追加。
⇒ (a b c)
(add-to-ordered-list 'foo 'b 4) ;; bを移動。
⇒ (a c b)
(add-to-ordered-list 'foo 'd) ;; dを後に追加。
⇒ (a c b d)
(add-to-ordered-list 'foo 'e) ;; eを追加。
⇒ (a c b e d)
foo ;; fooが変更された。
⇒ (a c b e d)
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
基本関数setcarおよびsetcdrにより、コンスセルのCARおよびCDRの内容を変更できます。わたしたちは、これらが既存のリスト構造を変更することから、これらを“破壊的”処理と呼びます。
Common Lispに関する注意: Common Lispはリスト構造の変更に
rplacaおよびrplacdを使用します。これらはsetcarやsetcdrと同じ方法でリスト構造を変更しますが、setcarとsetcdrは新しいCARまたはCDRをreturnするのにたいし、Common Lispの関数はコンスセルをreturnします。
5.6.1 Altering List Elements with setcar | リスト内の要素の置き換え。 | |
| 5.6.2 Altering the CDR of a List | リストの根幹部分の置き換え。これは要素の追加や削除に使用されます。 | |
| 5.6.3 Functions that Rearrange Lists | リスト内の要素の再配置、リストの合成。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
setcarコンスセルのCARの変更は、setcarにより行なわれます。リストにたいして使用された場合、setcarはリストの1つの要素を、他の要素に置き換えます。
この関数は、以前のCARを置き換えて、consの新しいCARにobjectを格納します。他の言い方をすると、この関数はconsのCARスロットを、objectを参照するように変更します。この関数は値objectをreturnします。たとえば:
(setq x '(1 2))
⇒ (1 2)
(setcar x 4)
⇒ 4
x
⇒ (4 2)
コンスセルが、複数のリストが共有された構造の一部の場合、コンスに新しいCARを格納することにより、これら共有されたリストの各1つの要素を変更します。以下は例です:
;; 部分的に共有された2つのリストを作成。
(setq x1 '(a b c))
⇒ (a b c)
(setq x2 (cons 'z (cdr x1)))
⇒ (z b c)
;; 共有されたリンクのCARを置き換え。 (setcar (cdr x1) 'foo) ⇒ foo x1 ; 両方のリストが変更された。 ⇒ (a foo c) x2 ⇒ (z foo c)
;; 共有されていないリンクのCARを置き換え。 (setcar x1 'baz) ⇒ baz x1 ; 1つのリストだけが変更された。 ⇒ (baz foo c) x2 ⇒ (z foo c)
なぜbを置き換えると両方が変更されるのかを説明するために、変数x1とx2の2つのリストによる共有構造を視覚化してみましょう:
--- --- --- --- --- ---
x1---> | | |----> | | |--> | | |--> nil
--- --- --- --- --- ---
| --> | |
| | | |
--> a | --> b --> c
|
--- --- |
x2--> | | |--
--- ---
|
|
--> z
同じ関係を別のボックス図で示すと、以下のようになります:
x1:
-------------- -------------- --------------
| car | cdr | | car | cdr | | car | cdr |
| a | o------->| b | o------->| c | nil |
| | | -->| | | | | |
-------------- | -------------- --------------
|
x2: |
-------------- |
| car | cdr | |
| z | o----
| | |
--------------
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
CDRを変更するもっとも低レベルの基本関数は、setcdrです:
この関数は前のCDRを置き換えて、consの新しいCDRにobjectを格納します。他の言い方をすると、この関数はconsのCDRを、objectを参照するように変更します。この関数は値objectをreturnします。
以下はリストのCDRを、他のリストに置き換える例です。1番目の要素以外のすべての要素は、別のシーケンスまたは要素のために取り除かれます。1番目の要素はリストのCARなので変更されず、CDRを通じて到達することもできないからです。
(setq x '(1 2 3))
⇒ (1 2 3)
(setcdr x '(4))
⇒ (4)
x
⇒ (1 4)
リスト内のコンスセルのCDRを変更することにより、リストの途中から要素を削除できます。たとえば以下では、1番目のコンスセルのCDRを変更することにより、2番目の要素bを、リスト(a
b c)から削除します。
(setq x1 '(a b c))
⇒ (a b c)
(setcdr x1 (cdr (cdr x1)))
⇒ (c)
x1
⇒ (a c)
以下に結果をボックス表記で示します:
--------------------
| |
-------------- | -------------- | --------------
| car | cdr | | | car | cdr | -->| car | cdr |
| a | o----- | b | o-------->| c | nil |
| | | | | | | | |
-------------- -------------- --------------
以前は要素bを保持していた2番目のコンスセルは、依然として存在して、そのCARもbのままですが、すでにこのリストの一部を形成していません。
CDRを変更して、新しい要素を挿入するのも、同じくらい簡単です:
(setq x1 '(a b c))
⇒ (a b c)
(setcdr x1 (cons 'd (cdr x1)))
⇒ (d b c)
x1
⇒ (a d b c)
以下に結果をボックス表記で示します:
-------------- ------------- -------------
| car | cdr | | car | cdr | | car | cdr |
| a | o | -->| b | o------->| c | nil |
| | | | | | | | | | |
--------- | -- | ------------- -------------
| |
----- --------
| |
| --------------- |
| | car | cdr | |
-->| d | o------
| | |
---------------
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下では、リストの構成要素であるコンスセルのCDRを変更することにより、リストを“破壊的”に再配置する関数をいくつか示します。これらの関数が“破壊的”だという理由は、これらの関数が引数として渡された元のリストを処理して、return値となる新しいリストを形成するために、リストのコンスセルを再リンクするからです。
コンスセルを変更する他の関数については、Using Lists as Setsのdelqを参照してください。
この関数は、listsの要素すべてを含むリストをreturnします。append (Building Cons Cells and Listsを参照してください)とは異なり、listsはコピーされません。かわりにlistsの各リストの最後のCDRが、次のリストを参照するように変更されます。listsの最後のリストは、変更されません。たとえば:
(setq x '(1 2 3))
⇒ (1 2 3)
(nconc x '(4 5))
⇒ (1 2 3 4 5)
x
⇒ (1 2 3 4 5)
nconcの最後の引数は変更されないので、上記の例のように、'(4
5)のような定数リストを使用するのが理に適っています。また、同じ理由により、最後の引数がリスとである必要はありません。
(setq x '(1 2 3))
⇒ (1 2 3)
(nconc x 'z)
⇒ (1 2 3 . z)
x
⇒ (1 2 3 . z)
しかし、(最後を除くすべての)他の引数はリストでなければなりません。
一般的な落とし穴としては、nconcにたいしてクォートされたリスト定数を、最後以外の引数として使用したときです。これを行なう場合、実行するごとにプログラムはリスト定数を変更するでしょう!
何が起こるのかを以下に示します:
(defun add-foo (x) ; この関数ではfoo
(nconc '(foo) x)) ; を引数の前に追加させたい。
(symbol-function 'add-foo)
⇒ (lambda (x) (nconc (quote (foo)) x))
(setq xx (add-foo '(1 2))) ; 動いているように見える。
⇒ (foo 1 2)
(setq xy (add-foo '(3 4))) ; 何が起きているのか?
⇒ (foo 1 2 3 4)
(eq xx xy)
⇒ t
(symbol-function 'add-foo)
⇒ (lambda (x) (nconc (quote (foo 1 2 3 4) x)))
この関数は、listの要素の順番を逆転します。reverseとは異なり、nreverseはリストを形成するCDR内のコンスセルを逆転することにより、引数を変更します。listの最後に使用されているコンスセルは、最初のコンスセルになります。
たとえば:
(setq x '(a b c))
⇒ (a b c)
x
⇒ (a b c)
(nreverse x)
⇒ (c b a)
;; 最初のコンスセルが最後になった。
x
⇒ (a)
わたしたちは通常、混乱を避けるために、nreverseの結果を、元のリストを保持していたのと同じ変数に格納します:
(setq x (nreverse x))
以下は、(a b c)を視覚的に表した、nreverseの例です:
元のリストの先頭: 逆転されたリスト: ------------- ------------- ------------ | car | cdr | | car | cdr | | car | cdr | | a | nil |<-- | b | o |<-- | c | o | | | | | | | | | | | | | | ------------- | --------- | - | -------- | - | | | | ------------- ------------
この関数は、listを安定的(しかし破壊的)にソートして、ソートされたリストをreturnします。この関数はpredicateを使用して要素を比較します。安定ソート(stable sort)では、同じソートキーをもつ要素が、ソートの前後で相対的に同じ順序が維持されます。安定性は、異なる条件によりソートするために要素を並び替えるために、連続したソートが使用されるときに重要です。
引数predicateは、2つの引数をとる関数でなければなりません。この関数はlistの2つの要素を引数として呼び出されます。昇順のソートを得るためのpredicateは、1番目の引数が、2番目の引数より“小さい”ときは非nil、それ以外はnilをreturnするようにします。
比較関数predicateは、少なくとも単独のsort呼び出しにおいて、任意の与えられた引数にたいして信頼できる結果を与えなければありません。比較関数は非対称的(antisymmetric)
— つまりaがbより小さいとき、bはaより小さくない —
でなければなりません。比較関数は推移的(transitive) —
つまりaがbより小さく、bがcより小さい場合、cはaより小さい —
でなければなりません。これらの要求を満たさない比較関数を使用した場合、sortの結果は予測できません。
sortの破壊的な側面は、CDRを変更することにより、listを形成するコンスセルを再配置することです。非破壊的なソート関数の場合は、ソートされた要素を格納するために、あたらしいコンスセルを作成します。元のリストを破壊せずにソートされたコピーを作成したい場合は、copy-sequenceで最初にコピーしてから、それをソートします。
ソートはlist内のコンスセルのCARは変更しません。list内でCARに要素aを保持していたコンスセル、ソート後にもaを保持しますが、CDRは変更されるので、ソート後の位置は異なります。たとえば:
(setq nums '(1 3 2 6 5 4 0))
⇒ (1 3 2 6 5 4 0)
(sort nums '<)
⇒ (0 1 2 3 4 5 6)
nums
⇒ (1 2 3 4 5 6)
警告:
numsのリストには0が含まれていないことに注意してください。これは前と同じコンスセルですが、リストの1番目ではなくなります。引数を保持するように形成された変数が、ソートされたリストでも保持されると仮定しないでください!
かわりにsortの結果を保存して、それを使用してください。元のリストを保持していた変数に、結果を書き戻すことはよく行なわれます。
(setq nums (sort nums '<))
ソート処理を行なう他の関数については、Sorting Textを参照してください。sortの有用な例は、Access to Documentation Stringsのdocumentationを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
リストは順序なしの数学的集合 — リスト内に要素があれば集合の要素の値とされ、リスト内の順序は無視される —
を表すことができます。2つの集合を結合(union)するには、(重複する要素を気にしない場合は)appendを使用します。equalである重複を取り除くには、delete-dupsを使用します。集合にたいする他の有用な関数には、memqやdelq、およびこれらのequalバージョンであるmemberとdeleteが含まれます。
Common Lispに関する注意: 集合を処理するために、Common Lispには(要素の重複がない)関数
unionがあります。これらの関数は標準のGNU Emacs Lispにはありませんが、cl-libはこれらを提供します。Lists as Sets in Common Lisp Extensionsを参照してください。
この関数は、objectがlistのメンバーかどうかをテストします。メンバーの場合、memqはobjectで最初に見つかった要素から開始されるリストをreturnします。メンバーでない場合は、nilをreturnします。memqの文字‘q’は、この関数がobjectとリスト内の要素の比較に、eqを使用することを示します。たとえば:
(memq 'b '(a b c b a))
⇒ (b c b a)
(memq '(2) '((1) (2))) ; (2)と(2)はeqではない。
⇒ nil
この関数listからはobjectとeqなすべての要素を破壊的に取り除いて、結果のリストをreturnします。delqの文字‘q’は、この関数がobjectとリスト内の要素の比較に、eqを使用することを示します(memqやremqと同様)。
delqを呼び出すときは通常、元のリストを保持していた変数にreturn値を割り当てて使用する必要があります(理由は以下参照)。
delq関数がリストの銭湯にある要素を削除する場合は、単にリストを読み進めて、この要素の後から開始される部分リストをreturnします。つまり:
(delq 'a '(a b c)) ≡ (cdr '(a b c))
リストの途中にある要素を削除するときは、必要なCDR(Altering the CDR of a Listを参照してください)を変更することにより削除します。
(setq sample-list '(a b c (4)))
⇒ (a b c (4))
(delq 'a sample-list)
⇒ (b c (4))
sample-list
⇒ (a b c (4))
(delq 'c sample-list)
⇒ (a b (4))
sample-list
⇒ (a b (4))
(delq 'a sample-list)は何も取り除きませんが(これは単に短いリストをreturnします)、(delq 'c
sample-list)は3番目の要素を取り除いて、sample-listを変更することに注意してください。引数listを保持するように形成された変数が、実行後にもっと少ない要素になる、または元のリストを保持すると仮定しないでください!
かわりにdelqの結果を保存して、それを使用してください。元のリストを保持していた変数に、結果を書き戻すことはよく行なわれます。
(setq flowers (delq 'rose flowers))
以下の例では、delqが比較しようとしている(4)と、sample-list内の(4)は、eqではありません:
(delq '(4) sample-list)
⇒ (a c (4))
与えられた値とequalな要素を削除したい場合は、delete(以下参照)を使用してください。
この関数は、objectとeqなすべての要素が除かれた、listのコピーをreturnします。remqの文字‘q’は、この関数がobjectとリスト内の要素の比較に、eqを使用することを示します。
(setq sample-list '(a b c a b c))
⇒ (a b c a b c)
(remq 'a sample-list)
⇒ (b c b c)
sample-list
⇒ (a b c a b c)
関数memqlは、eql(浮動少数の要素は値で比較される)を使用してメンバーとeqlを比較することにより、objectがlistのメンバーかどうかをテストします。objectがメンバーの場合、memqlはlist内で最初に見つかった要素から開始されるリストをreturnします。それ以外はnilをreturnします。
これをmemqと比較してみましょう:
(memql 1.2 '(1.1 1.2 1.3)) ; 1.2と1.2はeql。
⇒ (1.2 1.3)
(memq 1.2 '(1.1 1.2 1.3)) ; 1.2と1.2はeqではない。
⇒ nil
以下の3つの関数はmemq、delq、remqと似ていますが、要素の比較にeqではなく、equalを使用します。Equality Predicatesを参照してください。
関数memberは、メンバーとobjectをequalを使用して比較して、objectがlistのメンバーかどうかをテストします。objectがメンバーの場合、memberはlistで最初に見つかったところから開始されるリストをreturnします。それ以外はnilを参照してください。
これをmemqと比較してみましょう:
(member '(2) '((1) (2))) ; (2) and (2) are equal.
⇒ ((2))
(memq '(2) '((1) (2))) ; (2)と(2)はeqではない。
⇒ nil
;; 同じ内容の2つの文字列はequal。
(member "foo" '("foo" "bar"))
⇒ ("foo" "bar")
この関数は、sequenceからobjectとequalな要素を取り除いて、結果のシーケンスをreturnします。
sequenceがリストの場合、deleteがdelqに対応するように、memberはmemqに対応します。つまり、この関数はmemberと同様、要素とobjectの比較にequalを使用します。マッチする要素が見つかったら、delqが行なうように、その要素を取り除きます。delqと同様、通常は元のリストを保持していた変数にreturn値を割り当てて使用します。
sequenceがベクターまたは文字列の場合、deleteはobjectとequalなすべての要素を取り除いた、sequenceのコピーをreturnします。
たとえば:
(setq l '((2) (1) (2)))
(delete '(2) l)
⇒ ((1))
l
⇒ ((2) (1))
;; lの変更に信頼性を要するときは
;; (setq l (delete '(2) l))と記述する。
(setq l '((2) (1) (2)))
(delete '(1) l)
⇒ ((2) (2))
l
⇒ ((2) (2))
;; このケースではlのセットの有無に違いはない
;; しかし他のケースに倣ってセットするべき。
(delete '(2) [(2) (1) (2)])
⇒ [(1)]
この関数は、deleteに対応する非破壊的な関数です。この関数は、objectとequalな要素を取り除いた、sequence(リスト、ベクター、文字列)のコピーをreturnします。たとえば:
(remove '(2) '((2) (1) (2)))
⇒ ((1))
(remove '(2) [(2) (1) (2)])
⇒ [(1)]
Common Lispに関する注意: GNU Emacs Lispの関数
member、delete、removeは、Common Lispではなく、Maclispを継承しています。Common Lispでは、比較にequalを使用しません。
この関数は、memberと同様ですが、objectが文字列で、大文字小文字とテキスト表現の違いを無視します。文字の大文字と小文字は等しいものとして扱われ、比較に先立ちユニバイト文字列はマルチバイト文字列に変換されます。
この関数は、listからすべてのequalな重複を、破壊的に取り除いて。、結果をlistに保管して、それをreturnします。list内の要素にequalな要素がいくつかある場合、delete-dupsは最初の要素を残します。
変数に格納されたリストに要素を追加したり、それを集合として使用する方法については、Modifying List Variablesの関数add-to-listも参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
連想配列(association list。短くはalist)は、キーと値のマッピングを記録します。これは連想(associations)と呼ばれるコンスセルのリストです。各コンスセルにおいて、CARはキー(key)で、CDRは連想値(associated value)になります。3
以下はalistの例です。キーpineは、値conesに関連付けられます。キーoakは、acornsに関連付けられます。キーmapleは、seedsに関連付けられます。
((pine . cones) (oak . acorns) (maple . seeds))
alist内の値とキーには、任意のLispオブジェクトを指定できます。たとえば以下のalist0では、シンボルaは数字1に、文字列"b"はリスト(2
3)(alist要素のCDR)に関連付けられます。
((a . 1) ("b" 2 3))
要素のCDRのCARに連想値を格納するようにalistデザインするほうがよい場合があります。以下は、そのようなalistです。
((rose red) (lily white) (buttercup yellow))
この例では、redがroseに関連付けられる値だと考えます。この種のalistの利点は、CDRのCDRの中に、他の関連する情報
— 他のアイテムのリストでさえ —
を格納することができることです。不利な点は、与えられた値を含む要素を見つけるためにrassq(以下参照)を使用できないことです。これらを検討することが重要でない場合には、任意の与えられたalistにたいして一貫している限り、選択は好みの問題といえます。
上記で示したのと同じalistは、要素のCDRに連想値をもつと考えることができます。この場合、roseに関連付けられる値は、リスト(red)になるでしょう。
連想リストは、新しい連想を簡単にリストの先頭に追加できるので、スタックに保持したいような情報を記録するのによく使用されます。連想リストから与えられたキーにたいする連想を検索する場合、それが複数ある場合は、最初に見つかったものがreturnされます。
Emacs Lispでは、連想リストがコンスセルではない場合、それはエラーではありません。alist検索関数は、単にそのような要素を無視します。多くの他のバージョンのLいspでは、このような場合はエラーをシグナルします。
いくつかの観点において、プロパティーリストは連想リストと似ていることに注意してください。それぞれのキーが1度だけ出現するような場合、プロパティーリストは連想リストと同様に振る舞います。プロパティーリストと連想リストの比較については、Property Listsを参照してください。
この関数は、alist要素にたいしてkeyを比較するのにequalを使用して、alist内からkeyをもつ最初の連想をreturnします。CARがkeyとequalの連想がalistにない場合、この関数はnilをreturnします。たとえば:
(setq trees '((pine . cones) (oak . acorns) (maple . seeds)))
⇒ ((pine . cones) (oak . acorns) (maple . seeds))
(assoc 'oak trees)
⇒ (oak . acorns)
(cdr (assoc 'oak trees))
⇒ acorns
(assoc 'birch trees)
⇒ nil
以下はキーと値がシンボルでない場合の例です:
(setq needles-per-cluster
'((2 "Austrian Pine" "Red Pine")
(3 "Pitch Pine")
(5 "White Pine")))
(cdr (assoc 3 needles-per-cluster))
⇒ ("Pitch Pine")
(cdr (assoc 2 needles-per-cluster))
⇒ ("Austrian Pine" "Red Pine")
関数assoc-stringはassocと似ていますが、文字列間の特定の違いを無視する点が異なります。Comparison of Characters and Stringsを参照してください。
この関数は、alistの中から、値valueをもつ最初の連想をreturnします。CDRがvalueとequalの連想がalistにない場合、この関数はnilをreturnします。
rassocはassocと似ていますが、CARではなく、alistの連想のCDRを比較します。この関数を、与えられた値に対応するキーを探す、“reverse
assoc”と考えることができます。
この関数は、alistからkeyをもつ最初の連想をreturnする点はassocと同様ですが、比較にequalではなくeqを使用します。CARがkeyとeqな連想がalist内に存在しない場合、assqはnilをreturnします。eqはequalより早く、ほとんどのalistはキーにシンボルを使用するので、この関数はassocより多用されます。Equality Predicatesを参照してください。
(setq trees '((pine . cones) (oak . acorns) (maple . seeds)))
⇒ ((pine . cones) (oak . acorns) (maple . seeds))
(assq 'pine trees)
⇒ (pine . cones)
反対に、キーがシンボルではないalistでは通常、assqは有用ではありません:
(setq leaves
'(("simple leaves" . oak)
("compound leaves" . horsechestnut)))
(assq "simple leaves" leaves)
⇒ nil
(assoc "simple leaves" leaves)
⇒ ("simple leaves" . oak)
この関数は、alist内から値valueをもつ最初の連想をreturnします。alist内にCDRがvalueとeqな連想が存在しない場合は、nilをreturnします。
rassqはassqと似ていますが、CARではなく、alistの各連想のCDRを比較します。この関数を、与えられた値に対応するキーを探す、“reverse
assq”と考えることができます。
たとえば:
(setq trees '((pine . cones) (oak . acorns) (maple . seeds)))
(rassq 'acorns trees)
⇒ (oak . acorns)
(rassq 'spores trees)
⇒ nil
rassqは、要素のCDRのCARに保管された値の検索はできません:
(setq colors '((rose red) (lily white) (buttercup yellow)))
(rassq 'white colors)
⇒ nil
この場合、連想(lily
white)のCDRはwhiteではなく、リスト(white)です。これは連想をドットペア表記で記述すると明確になります:
(lily white) ≡ (lily . (white))
この関数は、keyにたいするマッチをalistから検索します。alistの各要素にたいして、この関数は、keyと要素(アトムの場合)、または要素のCAR(コンスの場合)を比較します。比較はtestに2つの引数
— 要素(または要素のCAR)とkey —
を与えて呼び出すことにより行なわれます。引数はこの順番で渡されるので、正規表現(Regular Expression Searchingを参照してください)を含むalistでは、string-matchを使用することにより有益な結果を得ることができます。testが省略されているかnilの場合は、比較にequalが使用されます。
alistの要素がこの条件によりkeyとマッチした場合、assoc-defaultはこの要素の値をreturnします。要素がコンスの場合、値は要素のCDRです。それ以外の場合、return値はdefaultです。
keyにマッチする要素がalistに存在しない場合、assoc-defaultはnilをreturnします。
この関数は、深さ2がレベルのalistのコピーをreturnします。この関数は各連想の新しいコピーを作成するので、元のalistを変更せずに、新しいalistを変更できます。
(setq needles-per-cluster
'((2 . ("Austrian Pine" "Red Pine"))
(3 . ("Pitch Pine"))
(5 . ("White Pine"))))
⇒
((2 "Austrian Pine" "Red Pine")
(3 "Pitch Pine")
(5 "White Pine"))
(setq copy (copy-alist needles-per-cluster))
⇒
((2 "Austrian Pine" "Red Pine")
(3 "Pitch Pine")
(5 "White Pine"))
(eq needles-per-cluster copy)
⇒ nil
(equal needles-per-cluster copy)
⇒ t
(eq (car needles-per-cluster) (car copy))
⇒ nil
(cdr (car (cdr needles-per-cluster)))
⇒ ("Pitch Pine")
(eq (cdr (car (cdr needles-per-cluster)))
(cdr (car (cdr copy))))
⇒ t
以下の例は、どのようにしてcopy-alistが他に影響を与えずにコピーの連想を変更可能なのかを示します:
(setcdr (assq 3 copy) '("Martian Vacuum Pine"))
(cdr (assq 3 needles-per-cluster))
⇒ ("Pitch Pine")
この関数は、alistから、(delqを使用した場合は、そのような要素を1つずつ削除するのにたいして)CARがkeyとeqな要素すべてを削除します。この関数は短くなったalistをreturnし、alistの元のリスト構造を変更することもよくあります。正しい結果を得るために、alistに保存された値ではなく、assq-delete-allのreturn値を使用してください。
(setq alist '((foo 1) (bar 2) (foo 3) (lose 4)))
⇒ ((foo 1) (bar 2) (foo 3) (lose 4))
(assq-delete-all 'foo alist)
⇒ ((bar 2) (lose 4))
alist
⇒ ((foo 1) (bar 2) (lose 4))
この関数は、alistからCDRがvalueとeqなすべての要素を削除します。この関数は短くなったリストをreturnし、alistの元のリスト構造を変更することもよくあります。rassq-delete-allはassq-delete-allと似ていますが、CARではなくalistの各連想のCDRを比較します。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
プロパティーリスト(property list。短くはplist)は、ペアになった要素のリストです。各ペアはプロパティー名(通常はシンボル)とプロパティー値を対応づけます。以下はプロパティーリストの例です:
(pine cones numbers (1 2 3) color "blue")
このプロパティーリストは、pineをcones、numbersを(1 2
3)、colorを"blue"に関連づけます。プロパティー名とプロパティー値には任意のLispオブジェクトを指定できますが、通常プロパティー名は(この例のように)シンボルです。
いくつかのコンテキストでプロパティーリストが使用されます。たとえば、関数put-text-propertyはプロパティーリストを引数にとり、文字列またはバッファー内のテキストにたいして、テキストプロパティーと、テキストに適用するプロパティー値を指定します。Text Propertiesを参照してください。
プロパティーリストが頻繁に使用される他の例は、シンボルプロパティーの保管です。すべてのシンボルは、シンボルに関する様々な情報を記録するために、プロパティーのリストを処理します。これらのプロパティーはプロパティーリストの形式で保管されます。Symbol Propertiesを参照してください。
| 5.9.1 Property Lists and Association Lists | プロパティーリストと連想リストの利点の比較。 | |
| 5.9.2 Property Lists Outside Symbols | 他の場所に保管されたプロパティーリストへのアクセス。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
連想リスト(Association Listsを参照してください)は、プロパティーリストとよく似ています。連想リストとは対照的に、プロパティー名は一意でなければならないので、プロパティーリスト内でペアの順序に意味はありません。
様々なLisp関数や変数に情報を付加するためには、連想リストよりプロパティーリストの方が適しています。プログラムでこのような情報すべてを1つの連想リストに保持する場合、特定のLisp関数や変数にたいする連想をチェックする度に、リスト全体を検索する必要が生じ、それにより遅くなる可能性があります。対照的に、関数名や変数自体のプロパティーリストに同じ情報を保持すれば、検索ごとにそのプロパティーリストの長さだけを検索するようになり、通常はこちらの方が短い時間で済みます。変数のドキュメントがvariable-documentationという名前のプロパティーに記録されているのは、これが理由です。同様にバイトコンパイラーも、特別に扱う必要がある関数を記録するためにプロパティーを使用します。
連想リストにも独自の利点があります。アプリケーションに依存しますが、プロパティーを更新するより、連想リストの先頭に連想を追加する方が速いでしょう。シンボルにたいするすべてのプロパティーは同じプロパティーリストに保管されるので、プロパティー名を異なる用途のために使用すると衝突の可能性があります(この理由により、そのプログラムで通常の変数や関数の名前につけるプレフィクスをプロパティー名の先頭につけることにより、一意と思われるプロパティー名を選ぶのはよいアイデアです)。連想リストは、連想をリストの先頭にpushし、後にある連想は無視されるので、スタックと同様に使用できます。これはプロパティーリストでは不可能です。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下の関数はプロパティーリストを操作するために使用されます。これらの関数はすべて、プロパティー名の比較にeqを使用します。
この関数は、プロパティーリストplistに保管された、プロパティーpropertyの値をreturnします。この関数には、変形された(malformed)plist引数を指定できます。plistでpropertyが見つからなかった場合、この関数はnilをreturnします。たとえば、
(plist-get '(foo 4) 'foo)
⇒ 4
(plist-get '(foo 4 bad) 'foo)
⇒ 4
(plist-get '(foo 4 bad) 'bad)
⇒ nil
(plist-get '(foo 4 bad) 'bar)
⇒ nil
この関数は、プロパティーリストplistに、プロパティーpropertyの値として、valueを保管します。この関数はplistを破壊的に変更するかもしれず、元のリスト構造を変更せずに新しいリストを構築することもあります。この関数は変更されたプロパティーリストをreturnするので、plistを取得した場所に書き戻すことができます。たとえば、
(setq my-plist '(bar t foo 4))
⇒ (bar t foo 4)
(setq my-plist (plist-put my-plist 'foo 69))
⇒ (bar t foo 69)
(setq my-plist (plist-put my-plist 'quux '(a)))
⇒ (bar t foo 69 quux (a))
plist-getと同様ですが、プロパティーの比較にeqではなくequalを使用します。
plist-putと同様ですが、プロパティーの比較にeqではなくequalを使用します。
この関数は与えられたpropertyがplistに含まれる場合は、非nilをreturnします。plist-getとは異なり、この関数は存在しないプロパティーと、値がnilのプロパティーを区別できます。実際にreturnされる値は、carがpropertyで始まる、plistの後尾部分です。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
シーケンス(sequence)型は、2つの異なるLisp型 — リストと配列 — を結合した型です。他の言い方をすると、任意のリストはシーケンスであり、任意の配列はシーケンスです。すべてのシーケンスがもつ共通な属性は、それぞれが順序づけされた要素のコレクションであることです。
配列(array)は各スロットが要素である、固定長のオブジェクトです。すべての要素に一定時間でアクセスできます。配列の4つの型として、文字列、ベクター、文字テーブル、ブールベクターがあります。
リストは要素のシーケンスですが、要素は単一の基本オブジェクトではありません。リストはコンスセルにより作られ、要素ごとに1つのセルをもちます。n番目の要素を探すには、n個のコンスセルを走査する必要があるので、先頭から離れた要素ほどアクセスに時間を要します。しかしリストは要素の追加や削除が可能です。
以下の図は、これらの型の関連を表します:
_____________________________________________
| |
| Sequence |
| ______ ________________________________ |
| | | | | |
| | List | | Array | |
| | | | ________ ________ | |
| |______| | | | | | | |
| | | Vector | | String | | |
| | |________| |________| | |
| | ____________ _____________ | |
| | | | | | | |
| | | Char-table | | Bool-vector | | |
| | |____________| |_____________| | |
| |________________________________| |
|_____________________________________________|
| 6.1 Sequences | 任意の種類のシーケンスを許す関数。 | |
| 6.2 Arrays | Emacs Lispの配列の特徴。 | |
| 6.3 Functions that Operate on Arrays | 配列に特化した関数。 | |
| 6.4 Vectors | Emacs Lispベクターの特質。 | |
| 6.5 Functions for Vectors | ベクターのための特別な関数。 | |
| 6.6 Char-Tables | 文字テーブルを扱う方法。 | |
| 6.7 Bool-vectors | ブールベクターを扱う方法。 | |
| 6.8 Managing a Fixed-Size Ring of Objects | オブジェクトの固定サイズのリングを管理する。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、任意の種類のシーケンスを許す関数を説明します。
この関数は、objectがリスト、ベクター、文字列、ブールベクター、文字テーブルの場合はt、それ以外はnilをreturnします。
この関数は、sequence内の要素の数をreturnします。sequenceがドットリストの場合、wrong-type-argumentエラーがシグナルされます。循環リストは無限ループを引き起こします。文字テーブルでは、Emacsの最大文字コードより、常に1大きい値がreturnされます。
関連する関数safe-lengthについては、Definition of safe-lengthを参照してください。
(length '(1 2 3))
⇒ 3
(length ())
⇒ 0
(length "foobar")
⇒ 6
(length [1 2 3])
⇒ 3
(length (make-bool-vector 5 nil))
⇒ 5
Text Representationsのstring-bytesも参照してください。
ディスプレー上での文字列の幅を計算する必要がある場合、文字数だけを数えて各文字のディスプレー幅を計算しないlengthではなく、string-width
(Size of Displayed Textを参照してください)を使用するべきです。
この関数は、indexによりインデックスづけされた、sequenceの要素をreturnします。indexの値として妥当なのは、0からsequenceの長さより1小さい数までの範囲の整数です。sequenceがリストの場合、範囲外の値はnthと同じように振る舞います。Definition of nthを参照してください。それ以外の場合、範囲外の値はargs-out-of-rangeエラーを引き起こします。
(elt [1 2 3 4] 2)
⇒ 3
(elt '(1 2 3 4) 2)
⇒ 3
;; eltがどの文字をreturnするか明確にするためにstringを使用。
(string (elt "1234" 2))
⇒ "3"
(elt [1 2 3 4] 4)
error→ Args out of range: [1 2 3 4], 4
(elt [1 2 3 4] -1)
error→ Args out of range: [1 2 3 4], -1
この関数は、aref (Functions that Operate on Arraysい)とnth (Definition of nthを参照してください)を一般化したものです。
この関数は、sequenceのコピーをreturnします。コピーは元のシーケンスと同じ型で、同じ要素が同じ順番でもちます。
コピーに新しい要素を格納するのは、元のsequenceに影響を与えず、その逆も真です。しかし新しいシーケンス内の要素がコピーされたものでない場合は、元のシーケンスの要素と同一(eq)になります。したがって、コピーされたシーケンスを通じて見つかった要素を変更すると、この変更は元のシーケンスでも見ることができます。
シーケンスがテキストプロパティーをともなう文字列の場合、コピー内のプロパティーリスト自身もコピーとなり、元のシーケンスのプロパティーリストと共有はされません。しかし、プロパティーリストの実際の値は共有されます。Text Propertiesを参照してください。
この関数は、ドットリストでは機能しません。循環リストのコピーは、無限ループを起こすでしょう。
シーケンスをコピーする別の方法は、Building Cons Cells and Listsのappend、Creating Stringsのconcat、Functions for Vectorsのvconcatも参照してください。
(setq bar '(1 2))
⇒ (1 2)
(setq x (vector 'foo bar))
⇒ [foo (1 2)]
(setq y (copy-sequence x))
⇒ [foo (1 2)]
(eq x y)
⇒ nil
(equal x y)
⇒ t
(eq (elt x 1) (elt y 1))
⇒ t
;; 一方のシーケンスの要素を置き換え。
(aset x 0 'quux)
x ⇒ [quux (1 2)]
y ⇒ [foo (1 2)]
;; 共有された要素の内部を変更。
(setcar (aref x 1) 69)
x ⇒ [quux (69 2)]
y ⇒ [foo (69 2)]
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
配列(array)オブジェクトは、いくつかのLispオブジェクトを保持するスロットをもち、これらのオブジェクトは配列の要素と呼ばれます。配列内の任意の要素は、一定時間でアクセスされます。対照的に、リスト内の要素のアクセスに要する時間は、その要素がリスト内のどの位置にあるかに比例します。
Emacsは4つの配列型 —文字列(strings。String Typeを参照してください)、ベクター(vectors。Vector Typeを参照してください)、ブールベクター(bool-vectors。Bool-Vector Typeを参照してください)、文字テーブル(char-tables。Char-Table Typeを参照してください)
—
を定義し、これらはすべて1次元です。ベクターと文字テーブルは任意の型の要素を保持できますが、文字列は文字だけ、ブールベクターはtかnilしか保持できません。
4種のすべての配列は、これらの特性を共有します:
arefにより参照されたり、関数asetにより変更されるかもしれません(Functions that Operate on Arraysを参照してください)。
配列を作成したとき、文字テーブル以外では、長さを指定しなければなりません。文字テーブルの長さは、文字コードの範囲により決定されるので、長さを指定できません。
原則として、テキスト文字の配列が欲しい場合は、文字列とベクターのどちらかを使用できます。実際のところ、そのような用途にたいしては、4つの理由により、わたしたちは常に文字列を選択します:
対照的に、(キーシーケンスのような)キーボード入力文字の配列では、多くのキーボード入力文字は、文字列に収まる範囲の外にあるので、ベクターが必要になるでしょう。Key Sequence Inputを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、すべての型の配列に適用される関数を説明します。
この関数は、objectが配列(ベクター、文字列、ブールベクター、文字テーブル)の場合は、tをreturnします。
(arrayp [a])
⇒ t
(arrayp "asdf")
⇒ t
(arrayp (syntax-table)) ;; 文字テーブル。
⇒ t
この関数は、arrayのindex番目の要素をreturnします。1番目の要素のインデクスは0です。
(setq primes [2 3 5 7 11 13])
⇒ [2 3 5 7 11 13]
(aref primes 4)
⇒ 11
(aref "abcdefg" 1)
⇒ 98 ; ‘b’のASCIIコードは98。
Sequencesの関数eltも参照してください。
この関数は、arrayのindex番目の要素を、objectにセットします。この関数はobjectをeturnします。
(setq w [foo bar baz])
⇒ [foo bar baz]
(aset w 0 'fu)
⇒ fu
w
⇒ [fu bar baz]
(setq x "asdfasfd")
⇒ "asdfasfd"
(aset x 3 ?Z)
⇒ 90
x
⇒ "asdZasfd"
arrayが文字列でobjectが文字でない場合、結果はwrong-type-argumentエラーになります。この関数は、文字列の挿入で必要な場合は、ユニバイト文字列をマルチバイト文字列に変換します。
この関数は配列arrayをobjectで充填するので、arrayのすべての要素はobjectになります。この関数はarrayをreturnします。
(setq a [a b c d e f g])
⇒ [a b c d e f g]
(fillarray a 0)
⇒ [0 0 0 0 0 0 0]
a
⇒ [0 0 0 0 0 0 0]
(setq s "When in the course")
⇒ "When in the course"
(fillarray s ?-)
⇒ "------------------"
arrayが文字列でobjectが文字でない場合、結果はwrong-type-argumentエラーになります。
配列と判っているオブジェクトにたいしては、一般的なシーケンス関数copy-sequenceおよびlengthが有用なときが多くあります。Sequencesを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ベクター(vector)とは、任意のLispオブジェクトを要素にもつことができる、一般用途のための配列です(対照的に、文字列の要素は文字だけですStrings and Charactersを参照してください)。Emacsではベクターは、キーシーケンス(Key Sequencesを参照してください)、シンボル検索用のテーブル(Creating and Interning Symbolsを参照してください)、バイトコンパイルされた関数表現の一部(Byte Compilationを参照してください)など、多くの目的で使用されます。
他の配列と同様、ベクターは0基準のインデックスづけを使用し、1番目の要素はインデックス0になります。
ベクターは、角カッコ(square
brackets)で囲まれた要素としてプリントされます。したがって、シンボルa、b、aを要素にもつベクターは、[a
b a]とプリントされます。Lisp入力として、同じ方法でベクターを記述できます。
文字列や数値と同様に、ベクターは定数として評価され、評価された結果は同じベクターになります。ベクターの要素は評価も確認もされません。Self-Evaluating Formsを参照してください。
以下はこれらの原理を表す例です:
(setq avector [1 two '(three) "four" [five]])
⇒ [1 two (quote (three)) "four" [five]]
(eval avector)
⇒ [1 two (quote (three)) "four" [five]]
(eq avector (eval avector))
⇒ t
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ベクターに関連した関数をいくつか示します:
この関数は、objectがベクターの場合は、tをreturnします。
(vectorp [a])
⇒ t
(vectorp "asdf")
⇒ nil
この関数は、引数objectsを要素にもつベクターを作成してreturnします。
(vector 'foo 23 [bar baz] "rats")
⇒ [foo 23 [bar baz] "rats"]
(vector)
⇒ []
この関数は、objectに初期化されたlength個の要素からなる、新しいベクターをreturnします。
(setq sleepy (make-vector 9 'Z))
⇒ [Z Z Z Z Z Z Z Z Z]
この関数は、sequencesのすべての要素を含む、新しいベクターをreturnします。引数sequencesは真リスト、ベクター、文字列、ブールベクターです。sequencesが与えられない場合、空のベクターがreturnされます。
値は空のベクター、または任意の既存のベクターとeqではない、新しい空ではないベクターのどちらかです。
(setq a (vconcat '(A B C) '(D E F)))
⇒ [A B C D E F]
(eq a (vconcat a))
⇒ nil
(vconcat)
⇒ []
(vconcat [A B C] "aa" '(foo (6 7)))
⇒ [A B C 97 97 foo (6 7)]
vconcat関数は、引数としてバイトコード関数オブジェクトもとることができます。これは、バイトコード関数オブジェクトの内容全体にアクセスするのを容易にするための、特別な機能です。Byte-Code Function Objectsを参照してください。
結合を行なう他の関数については、Mapping Functionsのmapconcat、Creating Stringsのconcat、Building Cons Cells and Listsのappendを参照してください。
append関数は、ベクターを同じ要素をもつリストに変換する方法も提供します:
(setq avector [1 two (quote (three)) "four" [five]])
⇒ [1 two (quote (three)) "four" [five]]
(append avector nil)
⇒ (1 two (quote (three)) "four" [five])
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
文字テーブル(char-table)はベクターとよく似ていますが、文字テーブルは文字コードによりインデックスづけされます。文字テーブルのインデックスには、修飾キーをともなわない任意の有効な文字コードを使用できます。他の配列と同様に、arefとasetで、文字テーブルの要素にアクセスできます。加えて、文字テーブルは、追加のデータを保持するために、特定の文字コードに関連づけられていない、エキストラスロット(extra
slots)をもつことができます。ベクターと同様、文字テーブルは、定数として評価され、任意の型の要素を保持できます。
文字テーブルはそれぞれサブタイプ(subtype)をもち、これは2つの目的を担うシンボルです:
display-tableの文字テーブルであり、構文テーブル(syntax
tables)は、サブタイプがsyntax-tableの文字テーブルです。以下で説明するように、関数char-table-subtypeを使用して、サブタイプを問い合わせることができます。
char-table-extra-slotsシンボルプロパティー(Symbol Propertiesを参照してください)により指定され、値は0から10の整数です。サブタイプにそのようなシンボルプロパティーがない場合、その文字テーブルはエキストラスロットをもちません。
文字テーブルは親(parent)をもつことができ、これは他の文字テーブルです。文字テーブルが親をもつ場合、その文字テーブルで特定の文字cにたいしてnilが指定されているときは、親として指定された文字テーブルで指定された値を継承します。言い方を変えると、文字テーブルchar-tableでcにnilが指定されている場合、(aref
char-table c)はchar-tableの親の値をreturnします。
文字テーブルはデフォルト値(default
value)をもつこともできます。デフォルト値をもつとき、文字テーブルchar-tableがcにたいしてnil値を指定すると、(aref
char-table c)はデフォルト値をreturnします。
サブタイプsubtype(シンボル)をもつ、新たに作成された文字テーブルをreturnします。各要素はinitに初期化され、デフォルトはnilです。文字テーブルが作成された後で、文字テーブルのサブタイプを変更することはできません。
すべての文字テーブルは、インデックスとなる任意の有効な文字テーブルのための空間をもつので、文字テーブルの長さを指定する引数はありません。
subtypeがchar-table-extra-slotsシンボルプロパティーをもつ場合、それはその文字列テーブル内のエキストラスロットの数を指定します。値には0から10の整数を指定し、これ以外の場合make-char-tableはエラーとなります。subtypeがchar-table-extra-slotsシンボルプロパティー(Property Listsを参照してください)をもたない場合、その文字テーブルはエキストラスロットをもちません。
この関数は、objectが文字テーブルの場合はt、それ以外はnilをreturnします。
この関数は、char-tableのサブタイプのシンボルをreturnします。
文字テーブルのデフォルト値にアクセスするための、特別な関数は存在しません。これを行なうには、char-table-rangeを使用します(以下参照)。
この関数は、char-tableの親をreturnします。親は常に、nil、または他の文字テーブルです。
この関数は、char-tableの親を、new-parentにセットします。
このガン数は、char-tableのエキストラスロットnの内容をreturnします。文字テーブルのエキストラスロットの数は、文字テーブルのサブタイプにより決定されます。
この関数は、char-tableのエキストラスロットnに、valueを格納します。
文字テーブルは、1つの文字コードにたいして、1つの要素値(element value)を指定できます。文字テーブルは文字セット全体にたいして値を指定することもできます。
この関数は、文字範囲rangeにたいして、char-tableで指定された値をreturnします。可能なrangeは以下のとおりです:
nilデフォルト値への参照。
文字charにたいする要素への参照(charは有効な文字コードであると仮定)。
(from . to)包括的な範囲‘[from..to]’内のすべての文字を参照するコンスセル。
この関数は、char-table内の文字範囲rangeにたいして値をセットします。可能なrangeは、以下のとおりです:
nilデフォルト値への参照。
t文字コード範囲の全体を参照。
文字charにたいする要素への参照(charは有効な文字コードであると仮定)。
(from . to)包括的な範囲‘[from..to]’内のすべての文字を参照するコンスセル。
この関数は、char-tableの非nil値ではない各要素にたいして、引数functionを呼び出します。functionの呼び出しでは、2つの引数(keyとvalue)が指定されます。keyはchar-table-rangeにたいする可能なrange
— 有効な文字か、同じ値を共有する文字範囲を指定するコンスセル(from
. to)です。valueは、(char-table-range char-table
key)がreturnする値です。
全体的に見て、functionに渡されるkey-valueのペアは、char-tableに格納されたすべての値を表します。
return値はm常にnilです。map-char-table呼び出しを有用にするために、functionは副作用をもつべきです。たとえば、以下は構文テーブルを調べる方法です:
(let (accumulator)
(map-char-table
#'(lambda (key value)
(setq accumulator
(cons (list
(if (consp key)
(list (car key) (cdr key))
key)
value)
accumulator)))
(syntax-table))
accumulator)
⇒
(((2597602 4194303) (2)) ((2597523 2597601) (3))
... (65379 (5 . 65378)) (65378 (4 . 65379)) (65377 (1))
... (12 (0)) (11 (3)) (10 (12)) (9 (0)) ((0 8) (3)))
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ブールベクター(bool-vector)はベクターとよく似ていますが、値にtとnilしか格納できません。ブールベクターの要素に非nil値の格納を試みた場合、そこにtが格納されます。すべての配列と同様、ブールベクターのインデックスは0から開始され、1度ブールベクターが作成されたら、長さを変更することはできません。ブールベクターは定数として評価されます。
ブールベクターを処理する、特別な関数が2つあります。その関数意外にも、他の種類の配列に使用されるのと同じ関数で、ブールベクターを操作できます。
initialに初期化された、length要素の新しいブールベクターをreturnします。
この関数は、objectがブールベクターであればt、それ以外はnilをreturnします。
以下で説明するように、ブールベクターのセット処理を行なう関数がいくつかあります:
ブールベクターaとbの、ビットごとの排他的論理和(bitwise exclusive or)をreturnします。オプション引数cが与えられた場合、この処理の結果はcに格納されます。引数はすべて、同じ長さのブールベクターを指定します。
ブールベクターaとbの、ビットごとの論理和(bitwise or)をreturnします。オプション引数cが与えられた場合、この処理の結果はcに格納されます。引数はすべて、同じ長さのブールベクターを指定します。
ブールベクターaとbの、ビットごとの論理積(bitwise and)をreturnします。オプション引数cが与えられた場合、この処理の結果はcに格納されます。引数はすべて、同じ長さのブールベクターを指定します。
ブールベクターaとbの、差集合(set difference)をreturnします。オプション引数cが与えられた場合、この処理の結果はcに格納されます。引数はすべて、同じ長さのブールベクターを指定します。
ブールベクターaの、補集合(set complement)をreturnします。オプション引数bが与えられた場合、この処理の結果はbに格納されます。引数はすべて、同じ長さのブールベクターを指定します。
a内のすべてのt値が、bでもt値の場合はt、それ以外はnilをreturnします。引数はすべて、同じ長さのブールベクターを指定します。
iから始まるaの、bと等しい連続する要素の数をreturnします。aはブールベクターで、bはtかnil、iはaのインデックスです。
ブールベクターaの、tの要素の数をreturnします。
以下はブールベクターを作成、確認、更新する例です。長さ8以下のブール値のプリント表記は、1つの文字で表されることに注意してください。
(setq bv (make-bool-vector 5 t))
⇒ #&5"^_"
(aref bv 1)
⇒ t
(aset bv 3 nil)
⇒ nil
bv
⇒ #&5"^W"
control-_の2進コードは11111、control-Wは10111なので、この結果は理解できるでしょう。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
リング(ring)は、挿入、削除、ローテーション、剰余(modulo)でインデックスづけされた参照と走査(traversal)をサポートする、固定長のデータ構造です。ringパッケージにより、効率的なリングデータ構造が実装されています。このパッケージは、このセクションにリストされた関数を提供します。
killリングやマークリングのような、Emacsにあるいくつかの“リング”は、実際には単なるリストとして実装されていることに注意してください。したがって、これらのリングにたいしては、以下の関数は機能しないでしょう。
この関数は、sizeオブジェクトを保持できる、新しいリングをreturnします。sizeは整数です。
この関数は、objectがリングの場合はt、それ以外はnilをreturnします。
この関数は、ringの最大の要素数をreturnします。
この関数は、ringに現在含まれている、オブジェクトの数をreturnします。値は、ring-sizeでreturnされる値を超えることはありません。
この関数は、ring内のオブジェクトのリストをreturnします。リストの順序は、新しいオブジェクトが先頭になります。
個の関数は、ringのコピーを新しいリングとしてreturnします。新しいリングは、ringと同じ(eqな)オブジェクトを含みます。
この関数は、ringが空の場合はt、それ以外はnilをreturnします。
リング内の1番新しい要素は、常にインデックス0をもちます。より大きいインデックスは、より古い要素に対応します。インデックスは、リング長のmoduloにより計算されます。インデックス-1は1番古い要素、-2は次に古い要素、...となります。
この関数はインデックスindexにあるring内のオブジェクトをreturnします。indexには負、またはリング長より大きい数を指定できます。ringがからの場合、ring-refはエラーをシグナルします。
この関数は、1番新しい要素としてobjectをringに挿入し、objectをreturnします。
リングが一杯の場合、新しい要素のための空きを作るため、挿入により1番古い要素が削除されます。
ringからオブジェクトを削除して、そのオブジェクトをreturnします。引数indexは、どのアイテムを削除するかを指定します。これがnilの場合、それは1番古いアイテムを削除することを意味します。ringが空の場合、ring-removeはエラーをシグナルします。
この関数は、1番古い要素として、objectをringに挿入します。return値は、意味をもちません。
リングが一杯の場合、この関数は挿入される要素のための空きを作るために、1番新しい要素を削除します。
リングサイズを超えることを気にしない場合、そのリングをFIFO(first-in-first-out: 先入れ先出し)のキューとして使用することができます。たとえば:
(let ((fifo (make-ring 5)))
(mapc (lambda (obj) (ring-insert fifo obj))
'(0 one "two"))
(list (ring-remove fifo) t
(ring-remove fifo) t
(ring-remove fifo)))
⇒ (0 t one t "two")
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ハッシュテーブル(hash table)は、非常に高速なルックアップテーブルの一種で、キーを対応する値にマップするという点では、alist(Association Listsを参照してください)に似ています。ハッシュテーブルは、以下の点でalistと異なります:
Emacs Lispは、それらを処理する一連の関数とともに、一般的な用途のハッシュテーブルデータ型を提供します。ハッシュテーブルは特別なプリント表現をもち、それは‘#s’と、その後にハッシュテーブルのプロパティーと内容お指定するリストが続きます。Creating Hash Tablesを参照してください。(用語“ハッシュ表記(hash notation)”は、プリント表現の最初に‘#’を使用する、入力構文をもたないオブジェクトのことを指し、これは用語“ハッシュテーブル(hash table)”にたいしては使用されません。Printed Representation and Read Syntaxを参照してください。)
obarray(オブジェクト配列)もハッシュテーブルの一種ですが、これらは異なる型のオブジェクトで、intern(インターン)されたシンボルを記録するためだけに使用されます(Creating and Interning Symbolsを参照してください)。
| 7.1 Creating Hash Tables | ハッシュテーブルを作成する関数。 | |
| 7.2 Hash Table Access | ハッシュテーブルの内容の読み書き。 | |
| 7.3 Defining Hash Comparisons | 新たな比較方法の定義。 | |
| 7.4 Other Hash Table Functions | その他。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ハッシュテーブルを作成する基本的な関数は、make-hash-tableです。
この関数は、指定された引数に対応する、新しいハッシュテーブルを作成します。引数は、キーワード(特別に認識される独自のシンボル)と、それに対応する値を交互に指定することにより構成されます。
make-hash-tableでは、いくつかのキーワードが意味をもちますが、実際に知る必要があるのは、:testと:weaknessの2つだけです。
:test testこれは、このハッシュテーブルにたいしてキーを照合する方法を指定します。デフォルトはeqlであり、他の代替としてはeqやequalがあります:
eqlキーが数字の場合、それらがequalであれば、つまり、それらの値が等しく、どちらも整数、あるいはどちらも浮動少数の場合は“同一”です。それ以外では、2つの別々のオブジェクトは、決して“同一”になりません。
eq2つの個別のLispオブジェクトはすべて、“別”のキーです。
equal2つの個別のLispオブジェクトにたいして、それらがequalの場合、“同一”のキーです。
testにたいして追加の選択肢を定義するために、define-hash-table-test (Defining Hash Comparisonsを参照してください)を使用することができます。
:weakness weakハッシュテーブルのweakness(強度)は、ハッシュテーブル内に存在するキーと値を、ガーベージコレクションから保護するかどうかを指定します。
値weakは、nil、key、value、key-or-value、key-and-value、またはt(key-and-valueのエイリアス)のうちの1つを指定しなければなりません。weakがkeyの場合、そのハッシュテーブルは、(キーが他の場所で参照されていなければ)ハッシュテーブルのキーがガーベージコレクトされるのを妨げません。ある特定のキーがガーベージコレクトされた場合、それに対応する連想は、ハッシュテーブルから削除されます。
weakがvalueの場合、そのハッシュテーブルは、(値が他の場所で参照されていなければ)ハッシュテーブルの値がガベージコレクトされるのを妨げません。あるP特定の値がガーベージコレクトされた場合、それに対応する連想は、ハッシュテーブルから削除されます。
weakがkey-and-value(またはt)の場合、その連想を保護するために、キーと値の両方が生きていなければなりません。したがって、そのハッシュテーブルは、キーと値のどちらかをガーベージコレクトから守ることはしません。キーか値のどちらか一方がガーベージコレクトされたら、その連想は削除されます。
weakがkey-or-valueの場合、キーか値のどちらか一方で、その連想を保護することができます。したがって、キーと値の両方がガベージコレクトされたときだけ(それがハッシュテーブル自体にたいする参照でなければ)、ハッシュテーブルからその連想が削除されます。
weakにたいするデフォルトはnilなので、ハッシュテーブルから参照されているキーと値のすべては、ガーベージコレクションから保護されます。
:size sizeこれは、そのハッシュテーブルに連想を保管しようと計画している、連想の数にたいするヒントを指定します。数が概算で判っている場合、この方法でそれを指定することにより、処理を少し効率的にすることができます。小さすぎるサイズを指定した場合、そのハッシュテーブルは必要に応じて自動的に拡張子マスが、これを行なうには時間が余計にかかります。
デフォルトのサイズは65です。
:rehash-size rehash-sizeハッシュテーブルに連想を追加するとき、そのテーブルが“一杯(full)”の場合、テーブルは自動的に拡張します。この値は、そのときどれだけハッシュテーブルを拡張するかを指定します。
rehash-sizeが整数の場合(それは正であるべきです)、通常のサイズにrehash-sizeを加えることにより、ハッシュテーブルが拡張されます。rehash-sizeが浮動小数の場合(1より大きい方がよい)は、古いサイズにその数を乗じることにより、ガッシュテーブルが拡張されます。
デフォルト値は1.5です。
:rehash-threshold thresholdこれは、ハッシュテーブルが“一杯(full)”(なのでもっと大きく拡張する必要がある)だと判断される基準を指定します。thresholdの値は、1以下の、正の浮動小数点数であるべきです。実際のエントリー数が、通常のサイズにたいする指定した割合を超えた場合、そのハッシュテーブルは“一杯”になります。thresholdのデフォルトは、0.8です。
この関数はmake-hash-tableと同じですが、異なるスタイルの引数リストを指定します。引数testは、キーを照合する方法を指定します。
この関数は時代遅れです。かわりにmake-hash-tableを使用してください。
ハッシュテーブルのプリント表現を使用して、新しいハッシュテーブルを作成することもできます。指定されたハッシュテーブル内の各要素が、有効な入力構文(Printed Representation and Read Syntaxを参照してください)をもっていれば、Lispリーダーをこのプリント表現を読み取ることができます。たとえば以下は、値val1(シンボル)と300(数字)に関連づけられた、キーkey1とkey2(両方ともシンボル)を、新しいハッシュテーブルを指定します。
#s(hash-table size 30 data (key1 val1 key2 300))
ハッシュテーブルのプリント表現は、‘#s’と、その後の‘hash-table’で始まるリストにより構成されます。このリストの残りの部分は、そのハッシュテーブルのプロパティーと初期内容を指定する、0個以上のプロパティーと値のペアで構成されるべきです。プロパティーと値は、そのまま読み取られます。有効なプロパティー名は、size、test、weakness、rehash-size、rehash-threshold、およびdataです。dataプロパティーは、初期ないようにたいするキーと値のペアのリストであるべきです。他のプロパティーは、上記で説明したmake-hash-tableのキーワード(:size、:testなど)と同じ意味をもちます。
バッファーやフレームのような、入力構文をもたないオブジェクトを含む初期内容をもつハッシュテーブルを指定できないことに注意してください。そのようなオブジェクトは、ハッシュテーブルが作成された後に追加します。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、ハッシュテーブルにアクセスしたり、連想を保管する関数を説明します。一般的に、比較方法による制限がない限り、任意のLispオブジェクトをハッシュキーとして使用できます。
この関数はtableのkeyを照合して、それに関連づけられたvalue — table内にkeyをもつ連想が存在しない場合はdefault — をreturnします。
この関数は、table内に、値valueをもつkeyの連想を挿入します。tableがすでにkeyの連想をもつ場合、valueにより古い連想値が置き換えられます。
この関数は、tableにkeyの連想がある場合は、それを削除します。keyが連想をもたない場合、remhashは何も行ないません。
Common Lispに関する注意: Common
Lispでは、remhashが実際に連想を削除したときは非nil、それ以外はnilをreturnします。Emacs
Lispでは、remhashは常にnilをreturnします。
この関数は、ハッシュテーブルtableからすべての連想を削除するので、そのハッシュテーブルは空になります。これはハッシュテーブルのクリーニング(clearing)とも呼ばれます。
Common Lispに関する注意: Common
Lispでは、clrhashは空のtableをreturnします。Emacs
Lispではnilをreturnします。
この関数は、table内の各連想にたいして、1度ずつfunctionを呼び出します。関数functionは2つの引数
— tableにリストされたkeyと、それに関連づけられたvalue —
をとるべきです。maphashはnilをreturnします。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
define-hash-table-testにより、キーを照合する新しい方法を定義できます。この機能を使用するには、ハッシュテーブルの動作方法と、ハッシュコード(hash
code)の意味を理解する必要があります。
概念的にはハッシュテーブルを、1つの連想を保持できるスロットがたくさんある巨大な配列として考えることができます。キーを照合するには、まずgethashが、キーから整数のハッシュコード(hash
code)を計算します。配列内のインデックスを生成するために、gethashは、配列の長さにより、この整数のmoduloを得ます。それからキーが見つかったかどうか確認するために、そのスロット、もし必要なら近くのスロットを探します。
したがってキー照合の新しい方法を定義するためには、キーからハッシュコードを計算する関数と、2つのキーを直接比較する関数の両方が必要です。
この関数は、nameという名前の、新たなハッシュテーブルテストを定義します。
この方法でnameを定義した後では、make-hash-tableの引数testにこれを使用することができます。それを行なう場合、そのハッシュテーブルはキー値の比較にtest-fn、キー値から“ハッシュコード”を計算するためにhash-fnを使用することになります。
関数test-fnは2つの引数(2つのキー)をとり、それらが“同一”と判断されたときは非nilをreturnします。
関数hash-fnは1つの引数(キー)をとり、そのキーの“ハッシュコード”(整数)をreturnします。よい結果を得るために、この関数は負の整数を含む整数の全範囲を、ハッシュコードに使用するべきです。
指定された関数は、プロパティーhash-table-testの配下の、nameというプロパティーリストに格納されます。そのプロパティーの値形式は、(test-fn
hash-fn)です。
この関数は、Lispオブジェクトobjにたいするハッシュコードをreturnします。return値は、objと、それが指す別のLispオブジェクトの内容を表す整数です。
2つのオブジェクトobj1とobj2がequalの場合、(sxhash
obj1)と(sxhash obj2)は同じ整数になります。
2つのオブジェクトがequalでない場合、通常はsxhashがreturnする値は異なりますが、常に異なるとは限りません。稀にですが(運次第)、sxhashが同じ結果を与える、2つの異なって見えるオブジェクトに遭遇するかもしれません。
以下は、大の字小文字を区別しない、文字列のキーをもつハッシュテーブルを作成する例です。
(defun case-fold-string= (a b) (eq t (compare-strings a nil nil b nil nil t))) (defun case-fold-string-hash (a) (sxhash (upcase a))) (define-hash-table-test 'case-fold 'case-fold-string= 'case-fold-string-hash) (make-hash-table :test 'case-fold)
以下は、事前に定義されたテスト値equalと等価なテストを行なうハッシュテーブルを定義できるという例です。キーは任意のLispオブジェクトで、equalに見えるオブジェクトは、同じキーと判断されます。
(define-hash-table-test 'contents-hash 'equal 'sxhash) (make-hash-table :test 'contents-hash)
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下は、ハッシュテーブルに機能する他の関数です。
この関数は、tableがハッシュテーブルオブジェクトの場合は、非nilをreturnします。
この関数は、tableのコピーを作成してreturnします。そのテーブル自体がコピーされたものである場合だけ、キーと値が共有されます。
この関数はtable内の実際のエントリー数をreturnします。
この関数は、ハッシュを行なう方法と、キーを比較する方法を指定するために、tableが作成されたときに与えられたtestの値をreturnします。Creating Hash Tablesのmake-hash-tableを参照してください。
この関数は、ハッシュテーブルtableに指定されたweakの値をreturnします。
この関数は、tableのrehash-sizeをreturnします。
この関数は、tableのrehash-thresholdをreturnします。
この関数は、tableの現在の定義されたサイズをreturnします。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
シンボル(symbol)は、一意な名前をもつオブジェクトです。このチャプターでは、シンボル、シンボルの構成要素やプロパティーリスト、およびシンボルを作成、インターンする方法を説明します。別のチャプターでは、シンボルを変数として使用したり、関数名として使用する方法が説明されています。VariablesとFunctionsを参照してください。シンボルの正確な入力構文については、Symbol Typeを参照してください。
任意のLispオブジェクトがシンボルかどうかを、symbolpでテストできます:
この関数は、objectがシンボルの場合はt、それ以外はnilをreturnします。
| 8.1 Symbol Components | シンボルは名前、値、関数定義、プロパティーリストをもつ。 | |
| 8.2 Defining Symbols | 定義は、シンボルが使用される方法を示す。 | |
| 8.3 Creating and Interning Symbols | シンボルが一意に保たれる方法。 | |
| 8.4 Symbol Properties | さまざまな情報を記録するために、各シンボルはプロパティーリストをもつ。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
各シンボルは4つの構成要素(もしくは“セル”)をもち、各構成要素はそれぞれ別のオブジェクトを参照します:
そのシンボルの名前。
そのシンボルの、変数としての現在の値。
そのシンボルの関数定義。これはシンボル、キーマップ、キーボードマクロも保持できる。
そのシンボルのプロパティーリスト。
プリント名のセルは常に文字列を保持し、それを変更することはできません。他の3つのセルには、任意のLispオブジェクトをセットすることができます。
プリントメイのセルは、シンボルの名前となる文字列を保持します。シンボルは、シンボル名によりテキストとして表されるので、2つのシンボルが同じな前をもたないことが重要です。Lispリーダーは、シンボルを読み取るごとに、新たにそれを作成する前に、指定されたシンボルがすでに存在するか調べます。シンボルの名前を得るには、関数symbol-name(Creating and Interning Symbolsを参照してください)を使用します。
値のセルは、シンボルの変数としての値(そのシンボル自身がLisp式として評価されたときに得る値)を保持します。ローカルバインディング(local
binding)やスコーピングルール(scoping
rules)などのような複雑なものを含め、変数がセットされたり、取得される方法については、See section Variablesを参照してください。ほとんどのシンボルは、値として任意のLispオブジェクトをもつことができますが、一部の特別なシンボルは変更できない値をもちます。これらには、nil、t、および名前が‘:’で始まる任意のシンボル(キーワード(keyword)と呼ばれます)が含まれます。Variables that Never Changeを参照してください。
関数のセルは、シンボルの関数定義を保持します。実際は、fooの関数セルの中に保管されている関数を意味するとき、“関数foo”といってそれを参照することがよくあります。わたしたちは、必要な土岐だけ、これを明確に区別することにします。関数セルは通常、関数(Functionsを参照してください)か、マクロ(Macrosを参照してください)を保持するために使用されます。しかし、関数セルはシンボル(Symbol Function Indirectionを参照してください)、キーボードマクロ(see section Keyboard Macros)、キーマップ(see section Keymaps)、またはオートロードオブジェクト(Autoloadingを参照してください)を保持するためにも使用できます。シンボルの関数セルの内容を得るには、関数symbol-function
(Accessing Function Cell Contentsを参照してください)を使用します。
プロパティーリストのセルは通常、正しくフォーマットされたプロパティーリストを保持するべきです。シンボルのプロパティーリストを得るには、関数symbol-plistを使用します。Symbol Propertiesを参照してください。
巻子失せると値セルが、void(空)のときもあります。voidとは、そのセルがどのオブジェクトも参照していないことを意味します(これは、シンボルvoidを保持することとは異なり、シンボルnilを保持することとも異なります)。voidの関数セルまたは値セルを調べようとすると、結果は‘Symbol's
value as variable is void’のようなエラーとなります。
それぞれのシンボルは値セルと関数セルを別個にもつので、変数名と関数名が衝突することはありません。たとえば、シンボルbuffer-file-nameが、値(カレントバッファーでvisitされているファイルの名前)をもち、同様に関数定義(ファイルの名前をreturnする基本関数)をもつことができます:
buffer-file-name
⇒ "/gnu/elisp/symbols.texi"
(symbol-function 'buffer-file-name)
⇒ #<subr buffer-file-name>
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
定義(definition)とは、特別な方法で使用を意図することを宣言する、特別な種類のLisp式です。定義とは通常、シンボルにたいする値を指定するか、シンボルにたいする1つの種類の使用についての意味と、この方法で使用するときのシンボルの意味にたいするドキュメントを指定します。したがって、シンボルを変数として定義した場合、その変数の初期値と、加えてその変数のドキュメントを提供できます。
defvarおよびdefconstは、グローバル変数(global variable) —
Lispプログラムの任意の箇所からアクセスできる変数 —
として定義するスペシャルフォームです。変数についての詳細は、Variablesを参照してください。カスタマイズ可能な変数を定義するには、defcustom(これはサブルーチンとしてdefvarも呼び出します)を使用します(Customization Settingsを参照してください)。
原則として、最初にシンボルが変数として定義されていなくても、setqで任意のシンボルに値を割り当てることができます。しかし、使用したいそれぞれのグローバル変数にたいして、変数定義を記述するべきです。さもないと、レキシカルスコープ(Scoping Rules for Variable Bindingsを参照してください)が有効なときに変数が評価された場合、あなたのLispプログラムは正しく動作しないでしょう。
defunは、ラムダ式(lambda
expression)を生成して、そのシンボルの関数セルにそれを格納することにより、シンボルを関数として定義します。したがって、このシンボルの関数定義は、このラムダ式になります(関数セルの内容を意味する用語“関数定義(function
definition)”は、defunがシンボルに関数としての定義を与えるというアイデアに由来します)。Functionsを参照してください。
defmacroは、シンボルをマクロとして定義します。これはマクロオブジェクトを作成して、そのシンボルの関数セルにそれを格納します。シンボルにはマクロと関数を与えることができますが、マクロと関数定義はどちらも関数セルに保持されるのにたいし、関数セルに保持できるのは常にただ1つのLispオブジェクトなので、両方1度にそれを行なうことはできないことに注意してください。Macrosを参照してください。
前に注記したように、Emacs
Lispではシンボルを(たとえばdefvarで)変数として定義して、同じシンボルを(たとえばdefunで)関数やマクロとして、両方定義することができます。このような定義は衝突しません。
これらの定義は、プログラミングツールのガイドを果たすこともできます。たとえば、C-h fおよびC-h vコマンドは、関係ある変数、関数、マクロ定義へのリンクを含むヘルプバッファーを作成します。Name Help in The GNU Emacs Manualを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GNU Emacs Lispでシンボルが作成される方法を理解するには、Lispがシンボルを読み取る方法を理解しなければなりません。Lispは、同じ文字綴りを読み取ったら、毎回同じシンボルを見つけることを保証しなければなりません。これに失敗すると、完全な混乱を招くでしょう。
Lispリーダーがシンボルに出会うと、Lispリーダーは名前のすべての文字を読み取ります。その後Lispリーダーは、obarray(オブジェクト配列)と呼ばれるテーブル内のインデックスを決めるために、これらの文字を“ハッシュ(hash)”します。ハッシュ化(hashing)は何かを照合するのに効果的な方法です。たとえば、Jan Jonesを見つけるときは、電話帳を表紙から1頁ずつ探すのではなく、Jから探し始めます。これは簡単なバージョンのハッシュ化です。obarrayの各要素は、与えられたハッシュコードとともにすべてのシンボルを保持する、バケット(bucket)です。与えられた名前を探すためには、バケットの中からその名前のハッシュコードのすべてのシンボルを探すのが効果的です(同じアイデアは一般的なEmacsのハッシュテーブルでも使用されていますが、これらは異なるデータ型です。Hash Tablesを参照してください)。
探している名前のシンボルが見つかったら、リーダーはそのシンボルを使用します。obarrayにその名前のシンボルが含まれない場合、リーダーは新しいシンボルを作成して、それをobarrayに追加します。特定の名前のシンボルを探して追加することを、インターン(intern)すると言い、これが行なわれた後、そのシンボルはインターンされたシンボル(interned symbol)と呼ばれます。
インターンすることにより、ある特定の名前のシンボルは、それぞれのobarrayに1つだけであることが保証されます。同じ名前のシンボルは他に存在するかもしれませんが、同じobarrayではありません。したがってリーダーは、(同じobarrayを読みつづける限り)同じ名前にたいして、同じシンボルを取得します。
インターンは通常、リーダー内で自動的に発生しますが、他のプログラムがこれを行なう必要がある場合もあります。たとえば、M-xコマンドは、その後ミニバッファーを使用してコマンド名を文字列として取得し、その文字列をインターンして、インターンされたその名前のシンボルを得ます。
すべてのシンボルを含むobarrayはありません。実際、どのobarrayにも含まれないシンボルがいくつかあります。これらは、インターンされていないシンボル(uninterned symbols)と呼ばれます。インターンされていないシンボルも、他のシンボルと同じく4つのセルをもちます。しかし、インターンされていないシンボルへのアクセスを得る唯一の方法は、他の何らかのオブジェクトとして探すか、変数の値として探す方法だけです。
インターンされていないシンボルの作成は、Lispコードを生成するとき有用です。なぜなら、作成されたコード内で変数として使用されているインターンされていないシンボルは、他のLispプログラムで使用されている任意の変数と競合することはありえないからです。
Emacs
Lispでは、obarrayはベクターです。ベクター内の各要素がバケットになります。要素の値は、名前がそのバケットにハッシュされるインターンされたシンボル、またはバケットが空のときは0です。インターンされたシンボルは、そのバケット内の次のシンボルへの、内部リンク(ユーザーからは見えない)をもちます。これらのリンクは不可視なので、mapatomsを使用する方法をのぞき(以下参照)、obarray内のすべてのシンボルを探す方法はありません。バケット内のシンボルの順番に、意味はありません。
空のobarrayでは、すべての要素が0なので、(make-vector length
0)でobarrayを作成することができます。obarrayを作成する有効な方法は、これだけです。長さに素数を指定すると、よいハッシュ化がされる傾向があります。2の累乗から1減じた長さも、よい結果を生む傾向があります。
自分でobarrayにシンボルを置かないでください。これはうまくいきません —
obarrayに正しくシンボルを入力できるのは、internだけです。
Common Lispに関する注意: Common Lispとは異なり、Emacs Lispは1つのシンボルを複数のobarrayにインターンする方法を提供しません。
以下の関数のほとんどは、引数に名前とobarrayをとります。名前が文字列ではない、またはobarrayがベクターでない場合は、wrong-type-argumentエラーがシグナルされます。
この関数は、symbolの名前を文字列としてreturnします。たとえば:
(symbol-name 'foo)
⇒ "foo"
警告: 文字の置き換えにより文字列を変更すると、それはシンボルの名前を変更しますが、obarrayの更新には失敗するので、行なわないでください!
この関数は、新たに割り当てられた、名前がname(文字列でなかればならない)のインターンされていないシンボルをreturnします。このシンボルの値と関数はvoidで、プロパティーリストはnilです。以下の例では、symの値はfooとeqではありません。なぜなら、これは名前が‘foo’のインターンされていないシンボルだからです。
(setq sym (make-symbol "foo"))
⇒ foo
(eq sym 'foo)
⇒ nil
この関数は、名前がnameの、インターンされたシンボルをreturnします。オブジェクト配列obarrayの中にそのようなシンボルが存在しない場合、internはあたらしいシンボルを作成してobarrayに追加し、それをreturnします。obarrayが省略された場合、グローバル変数obarrayの値が使用されます。
(setq sym (intern "foo"))
⇒ foo
(eq sym 'foo)
⇒ t
(setq sym1 (intern "foo" other-obarray))
⇒ foo
(eq sym1 'foo)
⇒ nil
Common Lispに関する注意: Common Lispでは、既存のシンボルをobarrayにインターンできます。Emacs Lispでは、
internの引数はシンボルではなく文字列なので、これを行なうことはできません。
この関数は、obarray内の名前がnameのシンボル、obarrayにその名前のシンボルが存在しない場合はnilをreturnします。したがって、与えられた名前のシンボルがすでにインターンされているかテストするために、intern-softを使用することができます。obarrayが省略された場合は、グローバル変数obarrayの値が使用されます。
引数nameにはシンボルも使用できます。この場合、指定されたobarrayにnameがインターンされていればname、それ以外はnilをreturnします。
(intern-soft "frazzle") ; そのようなシンボルは存在しない。 ⇒ nil (make-symbol "frazzle") ; インターンされていないシンボルを作成する。 ⇒ frazzle
(intern-soft "frazzle") ; そのようなシンボルは見つからない。
⇒ nil
(setq sym (intern "frazzle")) ; インターンされたシンボルを作成する。
⇒ frazzle
(intern-soft "frazzle") ; シンボルが見つかった!
⇒ frazzle
(eq sym 'frazzle) ; そして、それは同じシンボル。
⇒ t
この変数は、internおよびreadで使用される、標準のobarrayです。
この関数は、オブジェクト配列obarrayの中のシンボルに1つにたいして、1度ずつfunctionを呼び出し、その後nilをreturnします。obarrayが省略された場合は、通常のシンボルにたいする標準のオブジェクト配列obarrayの値がデフォルトになります。
(setq count 0)
⇒ 0
(defun count-syms (s)
(setq count (1+ count)))
⇒ count-syms
(mapatoms 'count-syms)
⇒ nil
count
⇒ 1871
mapatomsを使用する他の例については、Access to Documentation Stringsのdocumentationを参照してください。
この関数は、オブジェクト配列obarrayから、symbolを削除します。obarrayの中にsymbolが存在しない場合、uninternは何も行ないません。obarrayがnilの場合は、現在のobarrayが使用されます。
symbolにシンボルではなく文字列を与えた場合、それはシンボルの名前を意味します。この場合、uninternは、(もしあれば)obarrayからその名前のシンボルを削除します。そのようなシンボルが存在する場合、uninternは何も行ないません。
uninternがシンボルを削除した場合はt、それ以外はnilをreturnします。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
シンボルは、そのシンボルについての様々な情報を記録するために使用される、任意の数のシンボルプロパティー(symbol
properties)をもつことができます。たとえば、シンボルのrisky-local-variableプロパティーがnilの場合は、その変数の名前が、危険なファイルローカル変数(File Local Variablesを参照してください)であることを意味します。
シンボルのプロパティーとプロパティー値はそれぞれ、、シンボルのプロパティーリストセル(Symbol Componentsを参照してください)に、プロパティーリスト形式(Property Listsを参照してください)で格納されます。
| 8.4.1 Accessing Symbol Properties | シンボルプロパティーへのアクセス。 | |
| 8.4.2 Standard Symbol Properties | シンボルプロパティーの標準的な意味。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下の関数は、シンボルプロパティーへのアクセスに使用できます。
この関数は、symbolのプロパティーリスト内の、propertyという名前のプロパティーの値をreturnします。そのようなプロパティーが存在しない場合は、nilをreturnします。したがって、値がnilのときと、プロパティーが存在しない場合の違いはありません。
名前propertyは、eqを使用して既存のプロパティーと比較されるので、任意のオブジェクトはプロパティーとして適正です。
例はputを参照してください。
この関数は、symbolのプロパティーリストの、プロパティー名propertyにvalueを配して、以前のプロパティー値を置き換えます。put関数は、valueをreturnします。
(put 'fly 'verb 'transitive)
⇒'transitive
(put 'fly 'noun '(a buzzing little bug))
⇒ (a buzzing little bug)
(get 'fly 'verb)
⇒ transitive
(symbol-plist 'fly)
⇒ (verb transitive noun (a buzzing little bug))
この関数は、symbolののののプロパティーリストをreturnします。
この関数は、symbolのプロパティーリストを、plistにセットします。plistは通常、適正なプロパティーリストであるべきですが、これは強制ではありません。return値はplistです。
(setplist 'foo '(a 1 b (2 3) c nil))
⇒ (a 1 b (2 3) c nil)
(symbol-plist 'foo)
⇒ (a 1 b (2 3) c nil)
通常の用途には使用されない、特別なobarray内のシンボルでは、非標準的で方法でプロパティーリストセルを使用することに意味があるかもしれません。実際に、abbrev(Abbrevs and Abbrev Expansionを参照してください)のメカニズムは、これを行なっています。
以下のように、setplistとplist-putにより、putを定義できます:
(defun put (symbol prop value)
(setplist symbol
(plist-put (symbol-plist symbol) prop value)))
この関数は、getと同じですが、symbolが関数エイリアス(function
alias)の場合は、実際の関数の名づけるシンボルのプロパティーリストを参照します。Defining Functionsを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下に、Emacsで特別な目的のために使用されるシンボルプロパティーをリストします。以下の表で、“名づけられた関数(the named function)”と言うときは、関数名がそのシンボルである関数を意味します。“名づけられた変数(the named variable)”などの場合も、同様です。
:advertised-bindingこのプロパティーリストは、名づけられた関数のドキュメントを表示するときの、優先されるキーバインディングを指定します。Substituting Key Bindings in Documentationを参照してください。
char-table-extra-slots値が非nilの場合は、名づけられた文字テーブル型の追加スロットの数を指定します。Char-Tablesを参照してください。
customized-faceface-defface-specsaved-facetheme-faceこれらのプロパティーは、フェイスの標準のフェイススペック(face
specs)、およびフォントスペックsaved-fase、customized-face、themed-faceを記録するために使用されます。これらのプロパティーを直接セットしないでください。これらのプロパティーはdefface、および関連する関数により管理されます。Defining Facesを参照してください。
customized-valuesaved-valuestandard-valuetheme-valueこれらのプロパティーは、カスタマイズ可能な変数のstandard-value、saved-value、customized-value(しかし保存はされない)、themed-valueを記録するために使用されます。これらのプロパティーを直接セットしないでください。これらはdefcustom、および関連する関数により管理されます。Defining Customization Variablesを参照してください。
disabled値が非nilの場合、名づけられた関数はコマンドとして無効になります。Disabling Commandsを参照してください。
face-documentation値には、名づけられたフェイスのドキュメント文字列が格納されます。これは、deffaceにより自動的にセットされます。Defining Facesを参照してください。
history-length値が非nilの場合、名づけられたヒストリーリスト変数の、ミニバッファーヒストリーの最大長を指定します。Minibuffer Historyを参照してください。
interactive-formこの値は、名づけられた関数の、インタラクティブ形式です。通常、これを直接セットするべきではありません。かわりに、スペシャルフォームinteractiveを使用してください。Interactive Callを参照してください。
menu-enableこの値は、名づけられたメニューアイテムが、メニュー内で有効であるべきかを決定するための式です。Simple Menu Itemsを参照してください。
mode-class値がspecialの場合、名づけられたメジャーモードは“special(特別)”です。Major Mode Conventionsを参照してください。
permanent-local値が非nilの場合、名づけられた変数はバッファーローカル変数となり、変数の値はメジャーモードの変更によりリセットされません。Creating and Deleting Buffer-Local Bindingsを参照してください。
permanent-local-hook値が非nilの場合、名づけられた変数はメジャーモードを変更したとき、フック変数のローカル値から削除されません。Setting Hooksを参照してください。
pure値が非nilの場合、名づけられた関数は、副作用の影響を受けないとみなされます。定数の引数で呼び出された場合、コンパイル時に評価することができます。これは、実行時のエラーをコンパイル時へとシフトします。
risky-local-variable値が非nilの場合、名づけられた変数は、ファイルローカル変数としては危険だとみなされます。File Local Variablesを参照してください。
safe-function値が非nilの場合、名づけられた関数は、評価において一般的に安全だとみなされます。Determining whether a Function is Safe to Callを参照してください。
safe-local-eval-function値が非nilの場合、名づけられた関数は、ファイルローカルの評価フォーム内で、安全に呼び出すことができます。File Local Variablesを参照してください。
safe-local-variable値は、名付けられた変数の、安全なファイルローカル値を決定する関数を指定します。File Local Variablesを参照してください。
side-effect-free非nil値は、関数の安全性(Determining whether a Function is Safe to Callを参照してください)、およびバイトコンパイラーの最適化を決定するために、名づけられた関数が副作用から自由であることを示します。これをセットしないでください。
variable-documentation非nilの場合、それは名づけられた変数のドキュメント文字列を指定します。ドキュメント文字列は、defvarおよび関連する関数により、自動的にセットされます。Defining Facesを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lispでの式の評価(evaluation)は、Lispインタープリター —
入力としてLispオブジェクトを受け取り、それの式としての値(value as an expression)を計算します —
により処理されます。評価を行なう方法は、そのオブジェクトのデータ型に依存し、それはこのチャプターで説明するルールにより行なわれます。インタープリターは、プログラムの一部を評価するために自動的に実行されますが、Lisp基本関数のevalを通じて、明示的に呼び出すこともできます。
| 9.1 Introduction to Evaluation | 事の在り方における評価。 | |
| 9.2 Kinds of Forms | さまざまなオブジェクト類が評価される方法。 | |
| 9.3 Quoting | (プログラム内に定数を配すための)評価の回避。 | |
| 9.4 Backquote | リスト構造の、より簡単な構築。 | |
| 9.5 Eval | Lispインタープリターを明示的に呼び出す方法。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lispインタープリター(またはLispエバリュエーター)は、Emacsの一部で、与えられた式の値を計算します。Lispで記述された関数が呼び出されるとき、エバリュエーターはその関数のbody(本文)の中の式を評価することにより、その関数の値を計算します。したがって、Lispプログラムを実行するとは、実際にはLispインタープリターを実行することを意味します。
評価されることを意図したLispオブジェクトは、フォーム(form)、または式(expression)と呼ばれます4。フォームはデータオブジェクトであり、単なるテキストではないというのは、Lisp風の言語と、通常のプログラミング言語との間にある、基本的な相違の1つです。任意のオブジェクトを評価できますが、実際に評価される事が非常に多いのは数字、シンボル、リスト、文字列です。
以降のセクションでは、各種フォームにたいして、それを評価することが何を意味するかの詳細を説明します。
Lispフォームを読み取り、それからそのフォームを評価するのは、非常に一般的なアクティビティーですが、読み取りと評価は別のアクティビティーであり、どちらか一方を単独で処理することができます。読み取りだけでは、何も評価されません。読み取りはLispオブジェクトのプリント表現を、そのオブジェクト自体に変換します。このオブジェクトは評価されるべきフォームなのか、そのれともまったく違う目的をもつかを指定するのは、readの呼び出し元の役目ですInput Functionsを参照してください。
評価とは再帰的な処理であり、あるフォームを評価することにより、そのフォームの一部が評価されるといったことがよくあります。たとえば、(car
x)のような関数呼び出し(function
call)のフォームを評価する場合、Emacsは最初にその引数(サブフォームx)を評価します。引数を評価した後、Emacsはその関数(car)を実行(executes)します。その関数がLispで記述されている場合は、関数のbody(本文)を評価することにより、実行が行なわれます(しかし、この例で使用しているcarはLisp関数ではなく、Cで実装された基本関数です)。関数と関数呼び出しについての情報は、Functionsを参照してください。
評価は、環境(environment)と呼ばれるコンテキストの内部で行なわれます。環境は、すべてのLisp変数(Variablesを参照してください)のカレント値とバインディングにより構成されます。5フォームが新たなバインディングを作成することなく、変数を参照するとき、その変数はカレントの環境により与えられる値に評価されます。フォームの評価は、変数のバインディングにより、一時的にその環境を変更することもあります(Local Variablesを参照してください)。
フォームの評価が、永続する変更を行なうこともあります。これらの変更は、副作用(side
effects)と呼ばれます。副作用を生成するフォームの例は、(setq foo 1)です。
コマンドキー解釈にたいする評価と混同しないでください。エディターのコマンドループは、アクティブなキーマップを使用して、キーボード入力をコマンド(インタラクティブに呼び出すことができる関数)に変換してから、そのコマンドを実行するためにcall-interactivelyを使用します。そのコマンドはLispで記述されている場合、コマンドの実行は通常、評価を伴います。しかし、このステップはコマンドキー解釈の一部とは考えません。Command Loopを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
評価される事を意図したLispオブジェクトは、フォーム(form)または式(expression))と呼ばれます。Emacsがフォームを評価する方法は、フォームのデータ型に依存します。Emacsは、3種の異なるフォーム — シンボル、リスト、および“その他すべての型” — を持ち、それらは評価される方法は異なります。このセクションでは、まず最初は自己評価フォームの“その他すべての型”から開始して、3つの種類をすべて1つずつ説明します。
| 9.2.1 Self-Evaluating Forms | 自分自身を評価するフォーム。 | |
| 9.2.2 Symbol Forms | 変数として評価されるシンボル。 | |
| 9.2.3 Classification of List Forms | さまざまな種類のリストフォームを区別する方法。 | |
| 9.2.4 Symbol Function Indirection | シンボルがリストのcarにある場合、そのシンボルを通じて実際の関数を見つけます。 | |
| 9.2.5 Evaluation of Function Forms | 関数を呼び出すフォーム。 | |
| 9.2.6 Lisp Macro Evaluation | マクロを呼び出すフォーム。 | |
| 9.2.7 Special Forms | "スペシャルフォーム"は特有な基本のフォームで、それらのほとんどがとても重要です。 | |
| 9.2.8 Autoloading | 実際の定義を含むファイルのロードをセットアップする関数。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
自己評価フォーム(self-evaluating
form)は、リストやシンボルではない、任意のフォームです。自己評価フォームは、フォーム自身を評価します。評価の結果は、評価されたのと同じオブジェクトです。したがって、数字の25は25に評価され、文字列"foo"は文字列"foo"に評価されます。同様に、ベクターの評価では、ベクターの要素の評価は起こりません
— 内容が変更されずに同じベクターがreturnされます。
'123 ; 評価されずに表示される数字。
⇒ 123
123 ; 通常どおり評価され、同じものがreturnされる。
⇒ 123
(eval '123) ; “手動”による評価 — 同じものがreturnされる。
⇒ 123
(eval (eval '123)) ; 2度評価しても何も変わらない。
⇒ 123
事項評価されるという事実による利点から、数字、文字、文字列、そしてベクターでさえ、Lispコード内で記述されるのは一般的です。しかし、入力構文がない型にたいしてこれを行なうのは極めて異例です。なぜなら、これらをテキスト的に記述する方法がないからです。Lispプログラムを使用して、これらの型を含むLisp式を構築するのは、可能です。以下は例です:
;; バッファーオブジェクトを含む式を構築する。
(setq print-exp (list 'print (current-buffer)))
⇒ (print #<buffer eval.texi>)
;; それを評価する。
(eval print-exp)
-| #<buffer eval.texi>
⇒ #<buffer eval.texi>
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
シンボルが評価されるときは、変数として扱われます。それが値をもつ場合、結果はその変数の値になります。そのシンボルが変数としての値をもたない場合、Lispインタープリターはエラーをシグナルします。変数の使用法についての情報は、Variablesを参照してください。
以降の例では、setqでシンボルに値をセットしています。その後シンボルを評価してから、その値をsetqに戻します。
(setq a 123)
⇒ 123
(eval 'a)
⇒ 123
a
⇒ 123
シンボルnilとtは特別に扱われるので、nilの値は常にnilになり、tの値は常にtになります。これらに他の値をセットしたり、他の値にバインドすることはできません。したがって、この2つのシンボルは、(たとえevalがそれらを他の任意のシンボルと同じように扱うとはいえ)自己評価フォームと同じように振る舞います。名前が‘:’で始まるシンボルも、同じ方法で自己評価されます。そして、(通常は)値を変更できない点も同じです。Variables that Never Changeを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
空ではないリストフォームは、関数呼び出し、マクロ呼び出し、スペシャルフォームのいずれかで、それは1番目の引数にしたがいます。これら3種のフォームは、以下で説明するように、異なる方法で評価されます。残りの要素は関数、マクロ、またはスペシャルフォームにたいする引数(arguments)を構成します。
空ではないリストを評価する最初のステップは、1番目の要素の確認です。この要素は単独で、そのリストがどの種類のフォームか、そして残りの引数をどのように処理するがを決定します。SchemeのようなLisp方言とは異なり、1番目の要素は評価されません。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
リストの最初の要素がシンボルの場合、評価はそのシンボルの関数セルを調べて、元のシンボルの代わりに、関数セルの内容を使用します。その内容が他のシンボルの場合、シンボルではないものが得られるまで、このプロセスが繰り返されます。このプロセスをシンボル関数インダイレクション(symbol function indirection: indirectionは間接の意)と呼びます。シンボル関数インダイレクションについての情報は、Naming a Functionを参照してください。
このプロセスの結果、シンボルの関数競るが同じシンボルを参照する場合、無限ループを起こす可能性があります。それ以外は、最終的には非シンボルにたどりつき、これは関数か、他の適切なオブジェクトであるはずです。
より正確に言うと、それはLisp関数(ラムダ式)、バイトコード関数、基本関数、Lispマクロ、スペシャルフォーム、またはオートロードオブジェクトであるべきです。これらの型のそれぞれについては、以降のセクションで説明します。これらの型以外のオブジェクトの場合、emacsはinvalid-functionエラーをシグナルします。
以下の例は、シンボルインダイレクションのプロセスを説明するものです。わたしたちは、シンボルの関数セルに関数をセットするのにfset、関数セルの内容(Accessing Function Cell Contentsを参照してください)を得るためにsymbol-functionを使用します。具体的に言うと、firstの関数セルにシンボルcarを格納し、シンボルfirstをersteの関数セルに格納します。
;; この関数セルのリンクを構築する:
;; ------------- ----- ------- -------
;; | #<subr car> | <-- | car | <-- | first | <-- | erste |
;; ------------- ----- ------- -------
(symbol-function 'car)
⇒ #<subr car>
(fset 'first 'car)
⇒ car
(fset 'erste 'first)
⇒ first
(erste '(1 2 3)) ; ersteにより参照される関数を呼び出す。
⇒ 1
対照的に、以下の例はシンボル関数インダイレクションを使用せずに関数を呼び出します。なぜなら、1番目の要素はシンボルではなく、無名Lisp関数(anonymous Lisp function)だからです。
((lambda (arg) (erste arg))
'(1 2 3))
⇒ 1
関数自身を実行すると、その関数のbodyを評価します。これは、ersteを呼び出すとき、シンボル関数インダイレクションが行なわれます。
このフォームが使用されるのは稀で、今では推奨されません。かわりに以下のように記述するべきです:
(funcall (lambda (arg) (erste arg))
'(1 2 3))
または単に
(let ((arg '(1 2 3))) (erste arg))
ビルトイン関数のindirect-functionは、明示的にシンボル関数インダイレクションを処理するための、簡単な方法を提供します。
この関数は、functionが意味するものを、関数としてreturnします。functionがシンボルの場合は、functionの関数定義を探して、その値で最初からやり直します。functionがシンボルでない場合は、function自身をreturnします。
この関数は、最後のシンボルがバインドされておらず、オプション引数noerrorが省略されているかnilの場合は、void-functionエラーをシグナルします。それ以外は、noerrorが非nilの場合は、最後のシンボルがバインドされていなければnilをreturnします。
特定のシンボル内にループがある場合、この関数はcyclic-function-indirectionエラーをシグナルします。
以下は、Lispでindirect-functionを定義できるという例です:
(defun indirect-function (function)
(if (symbolp function)
(indirect-function (symbol-function function))
function))
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
リストの1番目の要素がLispの関数オブジェクト。バイトコードオブジェクト、基本関数オブジェクトと評価された場合、そのリストは関数呼び出し(function
call)になります。たとえば、以下は関数+を呼び出します:
(+ 1 x)
関数呼び出しを評価する最初のステップは、そのリストの残りの要素を左から右に評価します。結果は引数の実際の値で、リストの各要素にたいして1つの値となります。次のステップは、関数apply(Calling Functionsを参照してください)を使用して、引数のリストでその関数を呼び出します。関数がLispで記述されている場合、引数はその関数の引数変数にバインドするために使用されます。その後、関数body内のフォームが順番に評価され、listのbodyフォームの値は、関数呼び出しの値になります。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
リストの最初の要素がマクロオブジェクトと評価された場合、そのリストはマクロ呼び出し(macro call)になります。マクロ呼び出しが評価されるとき、リストの残りの要素は、最初は評価されません。そのかわり、これらの要素自体が、マクロの引数に使用されます。そのマクロ定義は、これは元のフォームの場所で評価される、置き換えのフォームを計算します。これは、マクロの展開(expansion)と呼ばれます。展開した結果は、任意の種類のフォーム — 自己評価定数、シンボル、リストになります。展開した結果自体がマクロ呼び出しの場合、結果が他の種類のフォームになるまで、繰り返し展開処理が行なわれます。
通常のマクロ展開は、その展開形を評価することにより終了します。しかし、他のプログラムもマクロ呼び出しを展開し、それらが展開形を評価するかもしれないし、評価しないかもしれないので、そのマクロ展開がすぐに、または最終的に評価される必要がない場合があります。
引き数式は通常、マクロ展開の計算の一部としては評価されませんが、展開の部分として現れるので、展開形が評価されるとき計算されます。
たとえば、以下のようなマクロ定義が与えられたとします:
(defmacro cadr (x) (list 'car (list 'cdr x)))
(cadr (assq 'handler list))のような式はマクロ呼び出しであり、展開形は以下のようになります:
(car (cdr (assq 'handler list)))
引数(assq 'handler list)が、展開形に含まれることに注意してください。
Emacs Lispマクロの完全な説明は、Macrosを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
スペシャルフォーム(special form)は特別だとマークされた基本関数で、その引数のすべては評価されません。もっともスペシャルなフォームは、制御構造の定義や、変数バインディングの処理など、関数ではできないことを行ないます。
スペシャルフォームはそれぞれ、どの引数が評価されて、どの引数が評価されないかについて、独自のルールをもちます。特定の引数が評価されるかどうかは、他の引数を評価した結果に依存します。
式の最初のシンボルがスペシャルフォームの場合、その式はそのスペシャルフォームのルールにしたがう必要があります。それ以外では、Emacsの挙動は(たとえクラッシュしなくても)定義されていません。たとえば((lambda
(x) x . 3)
4)は、lambdaで始まるサブ式を含みますが、これは適正なlambda式ではないので、Emacsはエラーをシグナルするか、3、または4、またはnil、もしかしたら他の挙動を示すかもしれません。
この述語は、引数がスペシャルフォームかをテストし、スペシャルフォームならt、それ以外はnilをreturnします。
以下に、Emacs Lispのスペシャルフォームすべてと、それらがどこで説明されているかのリファレンスとともに、アルファベット順でリストします。
andsee section Constructs for Combining Conditions
catchsee section Explicit Nonlocal Exits: catch and throw
condsee section Conditionals
condition-casesee section Writing Code to Handle Errors
defconstsee section Defining Global Variables
defvarsee section Defining Global Variables
functionsee section Anonymous Functions
ifsee section Conditionals
interactivesee section Interactive Call
lambdasee section Lambda Expressions
letlet*see section Local Variables
orsee section Constructs for Combining Conditions
prog1prog2prognsee section Sequencing
quotesee section Quoting
save-current-buffersee section The Current Buffer
save-excursionsee section Excursions
save-restrictionsee section Narrowing
setqsee section Setting Variable Values
setq-defaultsee section Creating and Deleting Buffer-Local Bindings
track-mousesee section Mouse Tracking
unwind-protectsee section Nonlocal Exits
whilesee section Iteration
Common Lispに関する注意: ここで、GNU Emacsのスペシャルフォームと、Common Lispのスペシャルフォームを比較してみます。
setq、if、catchは、Emacs LispとCommon Lispの両方でスペシャルフォームです。save-excursionはEmacs Lispではスペシャルフォームですが、Common Lispには存在しません。throwはCommon Lispではスペシャルフォーム(なぜなら複数の値をthrowできなければならない)ですが、Emacs Lispでは(複数の値をもたない)関数です。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
オートロード(autoload)機能により、関数定義がだEmacsにロードされていない関数(またはマクロ)を呼び出すことができます。オートロードは、定義がどのファイルに含まれるかを指定します。オートロードオブジェクトがシンボルの関数定義にある場合、関数としてそのシンボルを呼び出すことにより、自動的に指定されたファイルがロードされます。その後、ファイルからロードされた実際の定義を呼び出します。シンボル内の関数定義としてオートロードオブジェクトをアレンジする方法は、Autoloadで説明します。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
スペシャルフォームquoteは、単一の引数を、記述されたとおり、評価せずにreturnします。これはプログラムに、自己評価オブジェクトではない、定数シンボルや定数リストを含める方法を提供します(数字、文字列、ベクターのような自己評価オブジェクトをクォートする必要はありません)。
このスペシャルフォームは、評価せずにobjectをreturnします。
プログラム中でquoteはよく使用されるので、Lispはそれにたいする便利な入力構文を提供します。アポストロフィー文字(‘'’)に続けてLispオブジェクト(の入力構文)を記述すると、それは1番目の要素がquoteで、2番目の要素がそのオブジェクトであるリストに展開されます。したがって、入力構文'xは、(quote
x)の略記になります。
以下に、quoteを使用した式の例をいくつか示します:
(quote (+ 1 2))
⇒ (+ 1 2)
(quote foo)
⇒ foo
'foo
⇒ foo
''foo
⇒ (quote foo)
'(quote foo)
⇒ (quote foo)
['foo]
⇒ [(quote foo)]
他のクォート構成には、コンパイル用にLispで記述された無名のラムダ式の元になるfunction(Anonymous Functionsを参照してください)、および、リストを計算して置き換える際に、リストの一部だけをクォートするのに使用される‘`’(Backquoteを参照してください)があります。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バッククォート構成(backquote
constructs)を使用することにより、リストをクォートして、そのリストのある要素を選択的に評価することができます。もっとも簡単な使い方では、スペシャルフォームquoteと同じです
(前のセクションで説明しています。Quotingを参照してください)。
たとえば、以下の2つのフォームは同じ結果を生みます:
`(a list of (+ 2 3) elements)
⇒ (a list of (+ 2 3) elements)
'(a list of (+ 2 3) elements)
⇒ (a list of (+ 2 3) elements)
バッククォートする引数の内側でスペシャルマーカー‘,’を使用すると、それは値が定数でないことを示します。Emacs Lispエバリュエーターは‘,’がついた引数を放火して、リスト構造内にその値を配します:
`(a list of ,(+ 2 3) elements)
⇒ (a list of 5 elements)
‘,’による置き換え、リスト構造のより深いレベルでも使用できます。たとえば:
`(1 2 (3 ,(+ 4 5)))
⇒ (1 2 (3 9))
スペシャルマーカー‘,@’を使用すれば、評価された値を結果リストに継ぎ足す(splice)こともできます。継ぎ足されたリストの要素は、結果リスト内の他の要素を同じレベルになります。‘`’を使用しない等価なコードは、しばしば読むのが困難です。以下にいくつかの例を示します:
(setq some-list '(2 3))
⇒ (2 3)
(cons 1 (append some-list '(4) some-list))
⇒ (1 2 3 4 2 3)
`(1 ,@some-list 4 ,@some-list)
⇒ (1 2 3 4 2 3)
(setq list '(hack foo bar))
⇒ (hack foo bar)
(cons 'use
(cons 'the
(cons 'words (append (cdr list) '(as elements)))))
⇒ (use the words foo bar as elements)
`(use the words ,@(cdr list) as elements)
⇒ (use the words foo bar as elements)
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ほとんどの場合、実行されるプログラム内に出現することにより、フォームは自動的に評価されます。稀に、実行時 —
たとえば編集されているテキストや、プロパティーリストから取得したフォームを読み取った後 —
に計算されるように、フォームを評価するコードを記述する必要があるかもしれません。このようなときは、eval関数を使用します。evalが不必要だったり、かわりに他の何かを使用すべきときが、しばしばあります。たとえば、変数から値を取得するには、evalも機能しますが、symbol-valueのほうが適しています。evalで評価するためにプロパティーリストに式を格納するより、かわりにfuncallに渡すように関数を格納した方がよいでしょう。
このセクションで説明する関数と変数は、フォームの評価、評価処理の制限の指定、最後にreturnされた値の記録を行なうものです。ファイルのロードでも評価が行なわれます(Loadingを参照してください)。
データ構造に式を格納してそれを評価するより、データ構造に関数を格納して、それをfuncallやapplyで呼び出すほうが、より明解かつ柔軟です。関数を使用することにより、引数に情報を渡す能力が提供されます。
これは、式を評価する、基本的な関数です。この関数は、カレント環境内でformを評価して、その結果をreturnします。formオブジェクトの型は、それが評価される方法を決定します。Kinds of Formsを参照してください。
引数lexicalは、ローカル変数にたいするスコープ規則(Scoping Rules for Variable Bindingsを参照してください)を指定します。これが省略されるかnilの場合、デフォルトのダイナミックスコープ規則を使用してformを評価することを意味します。tの場合は、レキシカルスコープ規則が使用されることを意味します。lexicalの値には、レキシカルバインディングにたいする特定のレキシカル環境(lexical
environment)を指定する、空ではないalistも指定できます。しかし、この機能はEmacs
Lispデバッガーのような、特別な目的にたいしてのみ有用です。Lexical Bindingを参照してください。
evalは関数なので、eval呼び出しに現れる引数式は2回 —
1度はevalが呼び出される前の準備、そしてeval関数自身によりもう1度 — 評価されます。以下は例です:
(setq foo 'bar)
⇒ bar
(setq bar 'baz)
⇒ baz
;; evalが引数fooを受け取る。
(eval 'foo)
⇒ bar
;; evalが、fooの値である、引数barを受け取る。
(eval foo)
⇒ baz
evalにより現在アクティブな呼び出しの数は、max-lisp-eval-depthに制限されます(以下参照)。
この関数は、カレントバッファー内の、位置startとendで定義されるリージョン内のフォームを評価します。この関数はそのリージョンからフォームを読み取り、それらにたいしevalを呼び出します。これは、リージョンの最後に達するまで、または処理されないエラーがシグナルされるまで行なわれます。
デフォルトでは、eval-regionは何の出力も生成しません。しかし、streamが非nilの場合、出力関数(Output Functionsを参照してください)で生成された任意の出力、同様にリージョン内の式を評価した結果の値は、streamを使用してプリントされます。Output Streamsを参照してください。
read-functionが非nilの場合、readのかわりに1つずつ式を読み取るために使用する関数を指定します。これは、入力を読み取るストリームを指定する、1つの引数で呼び出される関数です。この関数を指定するために変数load-read-function(How Programs Do
Loadingを参照してください)も使用できますが、引数read-functionを使用するほうが確実です。
eval-regionはポイントを移動しません。つねにnilをreturnします。
この関数はeval-regionと似ていますが、引数は異なるオプション機能を提供します。eval-bufferは、バッファーbuffer-or-nameのアクセス可能な部分全体を処理します。buffer-or-nameにはバッファー名(文字列)を指定でき、nil(または省略)のときはカレントバッファーを意味します。streamがnilかつprintが非nilでない場合、eval-regionのようにstreamが使用されます。この場合、式の評価による結果の値は依然として破棄されますが、出力関数による出力はエコーエリアにプリントされます。filenameは、load-history(Unloadingを参照してください)に使用されるファイル名で、デフォルトはbuffer-file-name(Buffer File Nameを参照してください)です。unibyteが非nilの場合、可能な限りreadは文字列をユニコードに変換します。
eval-current-bufferは、このコマンドのエイリアスです。
この変数は、エラー(エラーメッセージは"Lisp nesting exceeds
max-lisp-eval-depth")がシグナルされる前に、eval、apply、funcallの呼び出しで許される最大の深さを定義します。
制限を超えたときのエラーをもつこの制限は、Emacs
Lispで誤って定義された関数による無限再帰を避ける方法の1つです。max-lisp-eval-depthの値を過大に増加させた場合、そのようなコードはかわりにスタックオーバーフローを起こすでしょう。
たとえば、Lisp式に記述された関数の呼び出し、関数呼び出しの引数と、関数bodyフォームにたいする再帰評価、Lispコード内での明示的な呼び出しなどにたいして、深さ制限を数えるために、内部的にeval、apply、funcallを使用します。
この変数のデフォルト値は400です。この値を100未満にセットした場合、値が与えられた値に達すると、Lispはそれを100にリセットします。空きが少ない場合、デバッガー自身を実行するために空きが必要になるので、Lispデバッガーに入ったときは、この値が増加されます。
max-specpdl-sizeはネストの他の制限を提供します。Local Variablesを参照してください。
この変数の値は、読み取り、評価、プリントを行なった標準的なEmacsコマンドにより、バッファー(ミニバッファーを含む)からreturnされる値のリストです(これには*ielm*バッファーでの評価や、lisp-interaction-modeでのC-jを使用した評価は含まれないことに注意してください)。要素の順番は、もっとも最近のものが最初になります。
(setq x 1)
⇒ 1
(list 'A (1+ 2) auto-save-default)
⇒ (A 3 t)
values
⇒ ((A 3 t) 1 …)
この変数は、最近評価されたフォームの値を後で参照するのに便利です。values自体の値をプリントするのは、それがおそらく非常に長くなるので、通常は悪いアイデアです。かわりに、以下のように特定の要素を調べます:
;; もっとも最近評価された結果を参照する。
(nth 0 values)
⇒ (A 3 t)
;; これは新たな要素をputするので、 ;; すべての要素が1つ後に移動する。 (nth 1 values) ⇒ (A 3 t)
;; これは次に新しい、この例の前の次に新しい要素を取得する。
(nth 3 values)
⇒ 1
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lispプログラムは、一連の式(expressions)、あるいはフォーム(forms)(Kinds of Formsを参照してください)により形成されます。これらのフォームの実行順は、それらを制御構造(control structures)で囲むことにより制御します。制御構造とは、その制御構造が含むフォームをいつ、どのような条件で、何回実行するかを制御する、スペシャルフォームです。
もっとも単純な実行順は、1番目はa、2番目はb、...という、シーケンシャル実行(sequential execution: 順番に実行)です。これは、関数のbody内の連続する複数のフォームや、Lispコードのファイル内のトップレベルを記述したときに発生します — つまり、フォームは記述した順に実行されます。わたしたちはこれをテキスト順(textual order)と呼びます。たとえば、関数のbodyが2つのフォームaとbから構成される場合、関数の評価は、最初にaを評価し、次にbを評価します。bを評価した結果が、その関数の値となります。
明示的に制御構造を使用することにより、シーケンシャルではない順番での実行が可能になります。
Emacs Lispは、他の様々な順序づけ、条件、繰り返し、(制御された)ジャンプを含む、複数の種類の制御構造を提供し、以下ではそれらすべてを記述します。ビルトインの制御構造は、制御構造のサブフォームが評価される必要がなかったり、順番に評価される必要がないので、スペシャルフォームです。独自の制御構造を構築するためにマクロを使用することができます(Macrosを参照してください)。
| 10.1 Sequencing | テキスト順の評価。 | |
| 10.2 Conditionals | if、cond、when、unless。
| |
| 10.3 Constructs for Combining Conditions | and、or、not。
| |
| 10.4 Iteration | whileループ。
| |
| 10.5 Nonlocal Exits | シーケンスの外へジャンプ。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
フォームが出現する順番に評価するのは、あるフォームから別のフォームに制御を渡す、もっとも一般的な制御です。関数のbodyのような、あるコンテキストにおいては、自動的にこれが行なわれます。他の場所では、これを行なうために制御構造を使用しなければなりません。Lispで一単純な制御構造は、prognです。
スペシャルフォームprognは、以下のようなものです:
(progn a b c …)
これは、順番にa、b、c、...を実行するよう指定します。これらはprognフォームのbodyと呼ばれます。body内の最後のフォームの値が、progn全体の値になります。(progn)はnilをreturnします。
初期のLispでは、prognは、連続で複数のフォームを実行して最後のフォームの値を使用する、唯一の方法でした。しかしプログラマーは、関数のbodyの、(その時点では)1つのフォームだけが許される場所で、prognを使用する必要が多いことに気づきました。そのため、関数のbodyを“暗黙のprogn”にして、prognのbodyのように複数のフォームを記述出きるようにしました。他の多くの制御構造も、同様に暗黙のprognを含みます。結果として、昔ほどprognは多用されなくなりました。現在では、prognが必要になるのは、unwind-protect、and、or、ifのthenパートの中がほとんどです。
このスペシャルフォームは、formsのすべてをテキスト順に評価して、のフォームの結果をreturnします。
(progn (print "The first form")
(print "The second form")
(print "The third form"))
-| "The first form"
-| "The second form"
-| "The third form"
⇒ "The third form"
他の2つの構成は、一連のフォームを同様に評価しますが、異なる値をreturnします:
このスペシャルフォームは、form1とformsのすべてをテキスト順に評価して、form1の結果をreturnします。
(prog1 (print "The first form")
(print "The second form")
(print "The third form"))
-| "The first form"
-| "The second form"
-| "The third form"
⇒ "The first form"
以下の例は、変数xのリストから1番目の要素を削除して、削除した1番目の要素の値をreturnします:
(prog1 (car x) (setq x (cdr x)))
このスペシャルフォームは、form1、form2、その後のformsのすべてをテキスト順で評価して、form2の結果をreturnします。
(prog2 (print "The first form")
(print "The second form")
(print "The third form"))
-| "The first form"
-| "The second form"
-| "The third form"
⇒ "The second form"
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
条件による制御構造は、候補の中から選択を行ないます。Emacs
Lispは4つの条件フォームをもちます。ifは他の言語のものとほとんど同じです。whenとunlessは、ifの変種です。condは一般化されたcase命令です。
ifは、conditionの値にもとづいて、then-formとelse-formsを選択します。評価されたconditionが非nilの場合は、then-formが評価されて、その結果がreturnされます。それ以外は、else-formsがテキスト順に評価されて、最後のフォームの値がreturnされます(ifのelseパートは、暗黙のprognの例です。Sequencingを参照してください)。
conditionの値がnilで、else-formsが与えられない場合、ifはnilをreturnします。
選択されなかったブランチは決して評価されない — 無視される —
ので、ifはスペシャルフォームです。したがって、以下の例ではprintは呼び出されることはないので、trueはプリントされません。
(if nil
(print 'true)
'very-false)
⇒ very-false
これは、else-formsがなく、複数のthen-formsがあるかもしれない、ifの変種です。特に、
(when condition a b c)
は以下と完全に等価です
(if condition (progn a b c) nil)
これはthen-formがない、ifの変種です:
(unless condition a b c)
は以下と完全に等価です
(if condition nil a b c)
condは、任意の数の候補から選択を行ないます。cond内の各clauseは、リストでなければなりません。このリストのCARはconditionで、(もしあれば)残りの要素はbody-formsです。したがって、条項は以下のようになります:
(condition body-forms…)
condは、各条項のconditionを評価することにより、テキスト順で条項を試験します。conditionの値が非nilの場合、その条項は“成り立ち”ます。その後、condは、その条項のbody-formsを評価して、body-formsの最後の値をreturnします。残りの条項は無視されます。
conditionの値がnilの場合、その条項は“成り立たず”、condは次の条項に移動して、その条項のconditionを試験します。
以下のようなものも、条項になります:
(condition)
conditionがテストされたときに非nilなら、condフォームはconditionの値をreturnします。
すべてのconditionがnilに評価された場合 —
つまりすべての条項が不成立の場合、condはnilをreturnします。
以下の例は4つの条項をもち、xの値が数字か、文字列化、バッファーか、シンボルかをテストします:
(cond ((numberp x) x)
((stringp x) x)
((bufferp x)
(setq temporary-hack x) ; 1つの条項に
(buffer-name x)) ; 複数bodyフォーム。
((symbolp x) (symbol-value x)))
前の条項が不成立のとき、最後の条項を実行したいときがよくあります。これを行なうには、(t
body-forms)のように、conditionの最後の条項にtを使用します。フォームtはtに評価され、決してnilにならないので、この条項が不成立になることはなく、最終的にcondはこの条項に到達します。たとえば:
(setq a 5)
(cond ((eq a 'hack) 'foo)
(t "default"))
⇒ "default"
このcond式は、aの値がhackの場合はfoo、それ以外は文字列"default"をreturnします。
任意の条件構成は、condかifで表すことができます。したがって、どちらを選択するかは、スタイルの問題です、たとえば:
(if a b c) ≡ (cond (a b) (t c))
| 10.2.1 Pattern matching case statement |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
特定の値を、可能なさまざまの場合にたいして比較するには、マクロpcaseが便利です。これは以下のフォームをとります:
(pcase exp branch1 branch2 branch3 …)
各branchは、(upattern body-forms…)というフォームです。
これは最初にexpを評価してから、どのbranchを使用するか、その値を各upatternと比較して、その後で対応するbody-forms実行します。一般的なのは、少数の異なる定数値を区別するために使用される場合です:
(pcase (get-return-code x) (`success (message "Done!")) (`would-block (message "Sorry, can't do it now")) (`read-only (message "The shmliblick is read-only")) (`access-denied (message "You do not have the needed rights")) (code (message "Unknown return code %S" code)))
最後の条項のcodeは、(get-return-code x)からreturnされた値にバインドされる変数です。
もっと複雑な例として、以下のような小さな式言語のための単純なインタープリターを示します(この例ではレキシカルバインディングが必要なことに注意してください):
(defun evaluate (exp env)
(pcase exp
(`(add ,x ,y) (+ (evaluate x env) (evaluate y env)))
(`(call ,fun ,arg) (funcall (evaluate fun env) (evaluate arg env)))
(`(fn ,arg ,body) (lambda (val)
(evaluate body (cons (cons arg val) env))))
((pred numberp) exp)
((pred symbolp) (cdr (assq exp env)))
(_ (error "Unknown expression %S" exp))))
`(add ,x
,y)は、expがシンボルaddで始まる3要素のリストかチェックして、その後2番目と3番目の要素を抽出し、それらを変数xとyにバインドするパターンです。(pred
numberp)はexpが数字かを単にチェックし、_はすべてのものにマッチするcatch-allパターンです。
以下に、いくつかの例を評価した結果とともに示します:
(evaluate '(add 1 2) nil) ;=> 3 (evaluate '(add x y) '((x . 1) (y . 2))) ;=> 3 (evaluate '(call (fn x (add 1 x)) 2) nil) ;=> 3 (evaluate '(sub 1 2) nil) ;=> error
pcaseに関係する2種類のパターンがあり、それらはU-patterns、Q-patternsと呼ばれます。上述のupatternはU-patternsで、以下の形式をもつことができます:
`qpatternこれは、もっとも一般的なパターンの1つです。このパターンの意図は、バッククォートマクロの模倣です。このパターンは、バッククォート式により構築されるような値にマッチします。わたしたちが行なうのは値の構築ではなくパターンマッチングなので、非クォートは式をどこに挿入するか示すのではなく、かわりにその位置で値にマッチすべき1つのU-patternを指定します。
より具体的には、Q-patternは以下のフォームをもつことができます:
(qpattern1 . qpattern2)このパターンは、carがqpattern1、cdrがpattern2にマッチする、任意のコンスセルにマッチします。
atomこのパターンは、atomにequalな任意のアトムにマッチします。
,upatternこのパターンは、upatternにマッチする任意のオブジェクトにマッチします。
symbolU-pattern内の単なるシンボルはすべてにマッチし、さらにマッチした値にそのシンボルをバインドするので、body-formsや皇族のパターンから、それを参照することができます。
_このパターン — いわゆるdon’t careパターン — はシンボルパターンと同様、すべてのものにマッチしますが、シンボルパターンとは異なり、変数へのバインドを行ないません。
(pred pred)このパターンは、マッチされるオブジェクトで関数predが呼び出したとき、非nilをreturnするものにマッチします。
(or upattern1 upattern2…)このパターンは、引数のパターンから最初に成立したパターンにマッチします。すべての引数パターンは、同じ変数にバインドされるべきです。
(and upattern1 upattern2…)このパターンは、すべての引数パターンが成立したときだけマッチします。
(guard exp)このパターンは調べられるオブジェクトを無視して、expが非nilに評価されたときは成立、それ以外は不成立となります。これは通常、andパターンの内部で使用されます。たとえば、(and
x (guard (< x 10)))は10より小さい任意の数字にマッチして、それを変数xにバインドします。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションは、複雑な条件を表現するために、ifやcondとともによく使用される3つの構成を記述します。andとorの構成は、ある種の複数条件の構成として、個別に使用することもできます。
この関数は、conditionが偽であることをテストします。この関数はconditionがnilの場合はt、それ以外はnilをreturnします。関数notはnullと等価で、わたしたちは空のリストをテストする場合は、nullの使用を推奨します。
スペシャルフォームandは、すべてのconditionsが真かどうかをテストします。この関数は、conditionsを記述された順に1つずつ評価することにより機能します。
あるconditionsがnilに評価された場合、残りのconditionsに関係なく、andはnilをreturnしなければなりません。この場合、andは即座にnilをreturnし、残りのconditionsは無視されます。
すべてのconditionsが非nilの場合、それらの最後の値がandフォームの値になります。conditionsのない単独の(and)は、tをreturnします。なぜなら、すべてのconditionsが非nilとなるので(考えてみてください。そうでないのはどれですか?)、これは適切です。
以下に例を示します。1番目の条件は整数1をretuenし、これはnilではありません。同様に2番目の条件は整数2をreturnし、これもnilではありません。3番目の条件はnilなので、のこりの条件が評価されることは決してありません。
(and (print 1) (print 2) nil (print 3))
-| 1
-| 2
⇒ nil
以下は、andを使用した、より現実的な例です:
(if (and (consp foo) (eq (car foo) 'x))
(message "foo is a list starting with x"))
(consp foo)がnilをreturnした場合、(car
foo)は実行されないので、エラーにならないことに注意してください。
ifかcondのどちらかを使用して、and式を記述することもできます。以下はその方法です:
(and arg1 arg2 arg3) ≡ (if arg1 (if arg2 arg3)) ≡ (cond (arg1 (cond (arg2 arg3))))
スペシャルフォームorは、少なくとも1つのconditionsが真かどうかをテストします。この関数は、すべてのconditionsを1つずつ、記述された順に評価することにより機能します。
あるconditionsが非nil値に評価された場合、orの結果は非nilでなければなりません。この場合、orは即座にreturnし、残りのconditionsは無視されます。この関数がreturnする値は、非nil値に評価された条件の値そのものです。
すべてのconditionsがnilになった場合、or式はnilをreturnします。conditionsのない単独の(or)は、nilをreturnします。なぜなら、すべてのconditionsがnilになるので(考えてみてください。そうでないのはどれですか?)、これは適切です。
たとえば、この式はxがnilまたは整数0かどうかをテストします:
(or (eq x nil) (eq x 0))
and構成と同様に、orをcondに置き換えて記述することができます。たとえば:
(or arg1 arg2 arg3)
≡
(cond (arg1)
(arg2)
(arg3))
ほとんどの場合、orをifに置き換えて記述できますが、完全ではありません:
(if arg1 arg1
(if arg2 arg2
arg3))
これは完全に同一ではありません。なぜならarg1またはarg2を2回評価するかもしれないからです。対照的に、(or
arg1 arg2 arg3)は2回以上引数を評価することは、決してありません。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
繰り返し(iteration)とは、プログラムの一部を繰り返し実行することを意味します。たとえば、リストの各要素、または0からnの整数にたいして、1度ずつ繰り返し何らかの計算をおこないたいとしましょうEmacs
Lispでは、スペシャルフォームwhileでこれを行なうことができます:
whileは、最初にconditionを評価します。結果が非nilの場合は、formsをテキスト順に評価します。その後conditionを再評価して、結果が非nilの場合、再度formsを評価します。この処理は、conditionがnilに評価されるまで繰り返されます。
繰り返し回数に制限はありません。このループは、conditionがnilに評価されるか、エラーとなるか、throwで抜け出す(Nonlocal Exitsを参照してください)まで計測されるでしょう
whileフォームの値は、常にnilです。
(setq num 0)
⇒ 0
(while (< num 4)
(princ (format "Iteration %d." num))
(setq num (1+ num)))
-| Iteration 0.
-| Iteration 1.
-| Iteration 2.
-| Iteration 3.
⇒ nil
各繰り返しごとに何かを実行して、その後も終了テストを行なう“repeat...until”ループを記述するには、以下のようにwhileの1番目の引数として、bodyの後に終了テストを記述して、それをprognの中に配します:
(while (progn
(forward-line 1)
(not (looking-at "^$"))))
これは1行前方に移動して、空行に達するまで行単位の移動を継続します。独特なのは、whileがbodyをもたず、終了テスト(これはポイント移動の実処理も行ないます)だけという点です。
マクロdolistおよびdotimesは、2つの一般的な種類のループを記述する、便利な方法を提供します。
この構成は、listの各要素にたいして1度bodyを実行し、カレント要素をローカルに保持するように、変数varにバインドします。その後、resultを評価した値、またはresultが省略された場合はnilをreturnします。たとえば、以下はreverse関数を定義するために、dolistを使用する方法の例です:
(defun reverse (list)
(let (value)
(dolist (elt list value)
(setq value (cons elt value)))))
この構成は、0以上count未満の各整数にたいして1度bodyを実行し、その繰り返しでの整数を、変数varにバインドします。その後、resultの値、またはresultが省略された場合はnilをreturnします。以下は、dotimesを使用して、何らかの処理を100回行なう例です:
(dotimes (i 100) (insert "I will not obey absurd orders\n"))
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
非ローカル脱出(nonlocal exit)とは、プログラム内のある位置から、別の離れた位置へ、制御を移します。Emacs Lispでは、エラーの結果として非ローカル脱出が発生することがあります。明示的な制御の下で非ローカル脱出を使用することもできます。非ローカル脱出は、脱出しようとしている構成により作成された、すべての変数バインディングのバインドを外します。
10.5.1 Explicit Nonlocal Exits: catch and throw | プログラム自身の目的による非ローカル脱出。 | |
10.5.2 Examples of catch and throw | このような非ローカル脱出が記述される方法を示します。 | |
| 10.5.3 Errors | エラーがシグナル・処理される方法。 | |
| 10.5.4 Cleaning Up from Nonlocal Exits | エラーが発生した場合のクリーンアップフォーム実行のアレンジ。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
catch and throwほとんどの制御構造は、そのコンストラクト自身内部の制御フローだけに影響します。関数throwは、通常のプログラム実行でのこのルールの例外です。これは、リクエストにより非ローカル脱出を行ないます(他にも例外はありますが、それらはエラー処理だけのものです)。throwはcatchの内部で試用され、catchに制御を戻します。たとえば:
(defun foo-outer ()
(catch 'foo
(foo-inner)))
(defun foo-inner ()
…
(if x
(throw 'foo t))
…)
throwフォームが実行された場合は、対応するcatchに制御を移し、catchは即座にreturnします。throwの後のコードは実行されません。throwの2番目の引数は、catchのreturn値として使用されます。
関数throwは、1番目の引数にもとづいて、それにマッチするcatchを探します。throwは、1番目の引数が、throwで指定されたものとeqなcatchを検索します。複数の該当するcatchがある場合、最内のものが優先されます。したがって、上記の例ではthrowがfooを指定し、foo-outer内のcatchが同じシンボルを指定しているので、(この間に他のマッチするcatchは存在しないと仮定すると)catchが該当します。
throwの実行により、マッチするcatchまでのすべてのリスプ構成(関数呼び出しを含む)を脱出します。この方法によりletや関数呼び出しのようなバインディング構成を脱出する場合、これらの構成を正常にexitしたときのように、そのバインディングは解かれます(Local Variablesを参照してください)。同様にthrowは、save-excursion(Excursionsを参照してください)により保存されたバッファーと位置を復元します。throwが、スペシャルフォームunwind-protectを脱出した場合、unwind-protectにより設定されたいくつかのクリーンアップも実行します。
ジャンプ先となるcatch内にレキシカル(局所的)である必要はありません。throwは、catch内で呼び出された別の関数から、同じようにに呼び出すことができます。throwが行なわれたのが、順序的に、catchに入った後でexitする前である限り、そのthrowはcatchにアクセスできます。エディターのコマンドループから戻るexit-recursive-editのようなコマンドで、throwが使用されるのは、これが理由です。
Common Lispに関する注意: Common Lispを含む、他のほとんどのバージョンのLispは、非シーケンシャルに制御を移す、いくつかの方法 — たとえば
return、return-from、go— をもちます。Emacs Lispの場合は、throwだけです。cl-libライブラリーは、これらのうちいくつかを提供します。Blocks and Exits in Common Lisp Extensionsを参照してください。
catchは、throw関数にたいするreturn位置を確立します。return位置はtagにより、そのような他のreturn位置と区別されます。tagは、nil以外の任意のLispオブジェクトです。引数tagはreturn位置が確立される前に、通常どおり評価されます。
return位置が効果をもつことにより、catchはbodyのフォームをテキスト順に評価します。フォームが(エラーは非ローカル脱出なしで)通常に実行された場合、bodyの最後のフォームの値が、catchからreturnされます。
bodyの実効の間にthrowが実行された場合、tagと同じ値を指定すると、catchフォームは即座にexitします。returnされる値は、それが何であれ、throwの2番目の引数に指定された値です。
throwの目的は、以前にcatchにより確立されたreturn位置に戻ることです。引数tagは、既存のさまざまなreturn位置からrturn位置を選択するために使用されます。複数のreturn位置がtagにマッチする場合、最内のものが使用されます。
引数valueは、catchからreturnされる値として使用されます。
タグtagのreturn位置が存在しない場合、データ(tag
value)とともに、no-catchエラーがシグナルされます。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
catch and throw2重にネストされたループから脱出する1つの方法は、catchとthrowを使うことです(ほとんどの言語では、これは“goto”により行なわれるでしょう)。ここでは、iとjを、0から9に変化させて(foo
i j)を計算します:
(defun search-foo ()
(catch 'loop
(let ((i 0))
(while (< i 10)
(let ((j 0))
(while (< j 10)
(if (foo i j)
(throw 'loop (list i j)))
(setq j (1+ j))))
(setq i (1+ i))))))
fooが非nilをreturnした場合、即座に処理を止めて、iとjのリストをreturnしています。fooが常にnilをreturnする場合、catchは通常どおりreturnし、その値はwhileの結果であるnilとなります。
以下では、2つのreturn位置を1度に表す、微妙に異なるトリッキーな例を2つ示します。最初に、同じタグhackにたいする2つのreturn位置があります:
(defun catch2 (tag)
(catch tag
(throw 'hack 'yes)))
⇒ catch2
(catch 'hack (print (catch2 'hack)) 'no) -| yes ⇒ no
どちらのreturn位置もthrowにマッチするタグをもつので、内側のもの、つまりcatch2で確立されたものにgotoします。したがってcatch2は通常どおり値yesをreturnするので、その値がプリントされます。最後に外側のcatchの2番目のbody、つまり'noが評価されて、外側のcatchからそれがreturnされます。
ここで、catch2に与える引数を変更してみます:
(catch 'hack (print (catch2 'quux)) 'no) ⇒ yes
この場合も2つのreturn位置がありますが、今回は外側だけがタグhackをもち、内側のものは、かわりにタグquuxをもちます。したがって、throwにより、外側のcatchが値yesをreturnします。関数printが呼び出されることはなく、bodyのフォーム'noも決して評価されません。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lispが、何らかの理由により評価できないようなフォームの評価を試みた場合には、エラー(error)がシグナル(signal)されます。
エラーがシグナルされた場合、エラーメッセージの表示とカレントこまんどの実行の終了が、Emacsデフォルトの反応です。たとえばバッファーの最後でC-fとタイプしたときのように、ほとんどの場合、これは正しい反応です。
複雑なプログラムでは、単なる終了が望ましくない場合もあるでしょう。たとえば、そのプログラムはデータ構造に一時的に変更を行なっていたり、プログラム終了前に削除すべき一時バッファーを作成しているかもしれません。このような場合、エラー時に評価されるクリーンアップ式(cleanup
expressions)を設定するために、unwind-protectを使用するでしょう(Cleaning Up from Nonlocal Exitsを参照してください)。サブルーチン内のエラーにもかかわらずに、プログラムの実行を継続したいときがあるかもしれません。この場合、エラー時のリカバリーを制御するためのエラーハンドラー(error
handlers)を設定するために、condition-caseを使用するでしょう。
エラーハンドリングを使用せずに、プログラムの一部から別の部分へ制御を移すためには、catchとthrowを使用します。Explicit Nonlocal Exits: catch and throwを参照してください。
| 10.5.3.1 How to Signal an Error | エラーを報告する方法。 | |
| 10.5.3.2 How Emacs Processes Errors | エラーを報告するときEmacsが何を行なうか。 | |
| 10.5.3.3 Writing Code to Handle Errors | エラーをトラップして実行を継続する方法。 | |
| 10.5.3.4 Error Symbols and Condition Names | エラートラッピングのために、エラーをクラス分けする方法。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
エラーのシグナリング(signaling)とは、エラーの処理を開始することを意味します。エラー処理は通常、実行中のプログラムのすべて、または一部をアボート(abort)して、エラーをハンドルするためにセットアップされた位置にreturnします。ここでは、エラーをシグナルする方法を記述します。
ほとんどのエラーは、たとえば、整数にたいしてCARを求めたり、バッファーの最後で1文字前方に移動したときなどのように、他の目的のために呼び出したLisp基本関数の中で、“自動的”にシグナルされます。関数errorとsignalで、明示的にエラーをシグナルすることもできます。
ユーザーがC-gをタイプしたときに発生するquitは、エラーとは判断されませんが、ほとんどはエラーと同様に扱われます。Quittingを参照してください。
すべてのエラーメッセージはそれぞれ、何らかのエラーメッセージを指定します。そのメッセージは、何が悪いのか(“File does not exist”)、物事がどうしてそうあるべきではない(“File must exist”)かを示すべきです。Emacs Lispの監修では、エラーメッセージは大文字で開始され、句読点で終わるべきではありません。
この関数は、format-stringとargsにたいして、format(Formatting Stringsを参照してください)を適用することにより構築されたエラーメッセージとともに、エラーをシグナルします。
以下は、errorを使用する典型的な例です:
(error "That is an error -- try something else")
error→ That is an error -- try something else
(error "You have committed %d errors" 10)
error→ You have committed 10 errors
2つの引数 — エラーシンボルerrorと、formatによりreturnされる文字列を含むリスト —
でsignalを呼び出すことにより、errorは機能します。
警告: エラーメッセージとして固定の文字列を使用したい場合、単に(error
string)とは記述しないでください。もしstringが‘%’を含む場合、それはフォーマット指定子(format
specifier)として解釈されてしまうので、望む結果は得られません。かわりに、(error "%s"
string)を使用してください。
この関数は、error-symbolにより命名されるエラーをシグナルします。引数dataは、エラーの状況に関連する追加のLispオブジェクトのリストです。
引数error-symbolは、エラーシンボル(error symbol) —
define-errorにより定義されYたシンボル — でなければなりません。これはEmacs
Lispが異なる種類のエラーをクラス分けする方法です。エラーシンボル(error symbol)、エラーコンディション(error
condition)、コンディション名(condition name)の説明については、Error Symbols and Condition Namesを参照してください。
エラーが処理されない場合、エラーメッセージをプリントするために2つの引数が使用されます。このエラーメッセージは通常、error-symbolのerror-messageプロパティーにより提供されます。dataが非nilの場合、その後にコロンと、dataの評価されていない要素を、カンマで区切ったリストが続きます。errorが発生した場合、エラーメッセージは、dataのCAR(文字列でなければなりません)です。file-errorのサブカテゴリーは、特別に処理されます。
data内のオブジェクトの数と重要性は、error-symbolに依存します。たとえば、wrong-type-argumentエラーでは、リスト内には2つのオブジェクト
— 期待する型を記述する述語と、その型への適合に失敗したオブジェクト — であるべきです。
エラーを処理する任意のエラーハンドラーにたいして、error-symbolとdataの両方を利用できます。condition-caseは、ローカル変数を(error-symbol
. data)というフォームでバインドします(Writing Code to Handle Errorsを参照してください)。
関数signalは、決してreturnしません。
(signal 'wrong-number-of-arguments '(x y))
error→ Wrong number of arguments: x, y
(signal 'no-such-error '("My unknown error condition"))
error→ peculiar error: "My unknown error condition"
この関数は、errorとまったく同じように振る舞いますが、errorではなく、user-errorというエラーシンボルを使用します。名前が示唆するように、このエラーはコード自身のエラーではなく、ユーザーパートのエラーの報告を意図しています。たとえば、Infoの閲覧履歴の開始を超えて履歴を遡るためにコマンドInfo-history-back
(l)を使用した場合、Emacsはuser-errorをシグナルします。このようなエラーでは、たとえdebug-on-errorが非nilであっても、デバッガーへのエントリーは発生しません。Entering the Debugger on an Errorを参照してください。
Common Lispに関する注意: Emacs Lispには、Common Lispのような継続可能なエラーのような概念は存在しません。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
エラーがシグナルされたとき、signalは、そのエラーにたいするアクティブなハンドラー(handler)を検索します。ハンドラーとは、Lispプログラムの一部でエラーが発生したときに実行するよう意図された、Lisp式のシーケンスです。そのエラーが適切なハンドラーをもつ場合、そのハンドラーが実行され、そのハンドラーの後から実行が再開されます。ハンドラーは、そのハンドラーが設定されたcondition-caseの環境内で実行されます。condition-case内のすべての関数呼び出しはすでに終了しているので、ハンドラーがそれらにreturnすることはありません。
そのエラーにたいする適切なハンドラーが存在しない場合は、カレントコマンドを終了して、エディターのコマンドループに制御をreturnします(コマンドループは、すべての種類のエラーにたいする暗黙のハンドラーをもちます)。コマンドループのハンドラーは、エラーメッセージをプリントするために、エラーシンボルと、関連付けられたデータを使用します。変数command-error-functionを使用して、これが行なわれる方法を制御できます:
この変数は、もし非nilの場合はEmacsのコマンドループに制御をreturnしたエラーの処理に使用する関数を指定します。この関数は3つの引数をとります。1つ目はdataで、condition-caseが自身の変数にバインドするのと同じフォームです。2つ目はcontextで、これはエラーが発生した状況を記述する文字列、またはnil(よくある)です。3つ目はcallerで、これはエラーをシグナルした基本関数を呼び出したLisp関数です。
明示的なハンドラーのないエラーは、Lispデバッガーを呼び出すかもしれません。変数debug-on-error (Entering the Debugger on an Errorを参照してください)が非nilの場合、デバッガーが有効です。エラーハンドラーとは異なり、デバッガーはそのエラーの環境内で実行されるので、エラー時の変数の値を正確に調べることができます。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
エラーをシグナルすることによる通常の効果は、実行されていたコマンドを終了して、Emacsエディターのコマンドループに即座にreturnすることです。スペシャルフォームcondition-caseを使用して、エラーハンドラーを設定することにより、プログラム内の一部で発生するエラーのをトラップを調整することができます。以下は単純な例です:
(condition-case nil
(delete-file filename)
(error nil))
これは、filenameという名前のファイルを削除して、任意のエラーをcatchして、エラーが発生した場合はnilを参照してください(このような単純なケースでは、マクロignore-errorsを使用することもできます。以下を参照してください)。
condition-case構成は、insert-file-contents呼び出しでのファイルオープンの失敗のような、予想できるエラーをトラップするために多用されます。condition-case構成は、ユーザーからの読み取った式を評価するプログラムのような、完全に予測できないエラーのトラップにも使用されます。
condition-caseの2番目の引数は、保護されたフォーム(protected
form)と呼ばれます(上記の例では、保護されたフォームは、delete-fileの呼び出しです)。このフォームの実行が開始されると、エラーハンドラーは効果をもち、このフォームがreturnすると不活性になります。その間のすべてにおいて、エラーハンドラーは効果をもちます。特に、このフォームで呼び出された関数、およびそのサブルーチンなどを実行する間、エラーハンドラーは効果をもちます。厳密にいうと、保護されたフォーム自身ではなく、保護されたフォームにより呼び出されたLisp基本関数(signalとerrorを含む)だけがシグナルされるというのは、よいことです。
保護されたフォームの後の引数はハンドラーです。各ハンドラーは、どのエラーを処理するかを指定する、1つ以上のコンディション名(condition
names)(シンボル)をリストします。エラーがシグナルされたとき、エラーシンボルはコンディション名のリストも定義します。エラーが共通の条件名をもつ場合、そのハンドラーはそのエラーに適用されます。上記の例では、1つのハンドラーがあり、それはすべてのエラーをカバーする条件名errorを指定しています。
適切なハンドラーの検索は、もっとも最近に設定されたハンドラーから開始して、設定されたすべてのハンドラーをチェックします。したがって、ネストされたcondition-caseフォームに同じエラー処理がある場合、内側のハンドラーがそれを処理します。
何らかのcondition-caseによりエラーが処理された場合、debug-on-errorでエラーによりデバッガーが呼び出されるようにしていても、通常はデバッガーの実行が抑制されます。
condition-caseにより補足されるようなエラーをデバッグできるようにしたい場合は、変数debug-on-signalに非nil値をセットします。以下のようにコンディションの中にdebugを記述することにより、最初にデバッガーを実行するような、特定のハンドラーを指定することもできます:
(condition-case nil
(delete-file filename)
((debug error) nil))
ここでのdebugの効果は、デバッガー呼び出しを抑制するcondition-caseを防ぐことだけです。debug-on-errorおよびその他のフィルタリングメカニズムがデバッガーを呼び出すように指定されているときだけ、エラーによりデバッガーが呼び出されます。Entering the Debugger on an Errorを参照してください。
マクロcondition-case-unless-debugは、そのようなフォームのデバッギングを処理する、別の方法を提供します。このマクロは、変数debug-on-errorがnilの場合、つまり任意のエラーを処理しないようなケース以外は、condition-caseとまったく同様に振る舞います。
特定のハンドラーがそのエラーを処理するとEmacsが判断すると、Emacsは制御をそのハンドラーにreturnします。これを行うために、Emacsはそのとき脱出しつつあるバインディング構成により作成されたすべての変数のバインドを解き、そのとき脱出しつつあるすべてのunwind-protectフォームを実行します。制御がそのハンドラーに達すると、そのハンドラーのbodyが通常どおり実行されます。
そのハンドラーのbodyを実行した後、condition-caseフォームから実行がreturnされます。保護されたフォームは、そのハンドラーの実行の前に完全にexitしているので、そのハンドラーはそのエラーの位置から実行を再開することはできず、その保護されたフォーム内で作られた変数のバインディングを調べることもできません。ハンドラーが行なえることは、クリーンアップと、処理を進行させることだけです。
エラーのシグナルとハンドルには、throwとcatch(Explicit Nonlocal Exits: catch and throw)に類似する点がいくつかありますが、これらは完全に別の機能です。エラーはcatchでキャッチできず、throwをエラーハンドラーで処理することはできません(しかし対応するcatchが存在しないときにthrowを仕様することによりシグナルされるエラーは、処理できます)。
このスペシャルフォームは、protected-formの実行を囲い込むエラーハンドラーhandlersを確立します。エラーなしでprotected-formが実行された場合、returnされる値はcondition-caseフォームの値になります。この場合、condition-caseは効果をもちません。protected-formの間にエラーが発生した場合、condition-caseは違いをもちます。
それぞれのhandlersは、(conditions
body…)というフォームのリストです。ここでconditionsは、ハンドルされるエラーコンディション名、またはそのハンドラーの前にデバッガーを実行するためのコンディション名(debugを含みます)です。bodyは、このハンドラーがエラーを処理するときに実行される、1つ以上のLisp式です。
(error nil) (arith-error (message "Division by zero")) ((arith-error file-error) (message "Either division by zero or failure to open a file"))
発生するエラーはそれぞれ、それが何の種類のエラーかを記述するエラーシンボル(error
symbol)をもち、これはコンディション名のリストも記述します(Error Symbols and Condition Namesを参照してください)。Emacsは、1つ以上のコンディション名を指定するハンドラーにたいして、すべてのアクティブなcondition-caseフォームを検索します。condition-caseの最内のマッチは、そのエラーを処理します。このcondition-caseでは、最初に適合したハンドラーが、そのエラーを処理します。
ハンドラーのbodyを実行した後、condition-caseは通常どおりreturnし、ハンドラーのbodyの最後の値を、ハンドラー全体の値として使用します。
引数varは変数です。protected-formを実行するとき、condition-caseはこの変数をバインドせず、エラーを処理するときだけバインドします。その場合は、varをエラー記述(error
description)にバインドします。これはエラーの詳細を与えるリストです。このエラー記述は、(error-symbol
.
data)というフォームをもちます。ハンドラーは、何を行なうか決定するために、このリストを参照することができます。たとえば、ファイルオープンの失敗にたいするエラーの場合、ファイル名がdata(エラー記述の3番目の要素)の2番目の要素になります。
varがnilの場合、それはバインドされた変数がないことを意味します。この場合、エラーシンボルおよび関連するデータは、そのハンドラーでは利用できません。
より外側のレベルのハンドラーにcatchさせるために、condition-caseによりcatchされたシグナルを再度throwする必要がある場合もあります。以下はこれを行なう方法です:
(signal (car err) (cdr err))
ここでerrはエラー記述変数(error description
variable)で、condition-caseの1番目の引数は、再throwしたいエラーコンディションです。Definition of signalを参照してください。
この関数は、与えられたエラー記述子(error descriptor)にたいするエラーメッセージ文字列をreturnします。これは、そのエラーにたいする通常のエラーメッセージをプリントすることにより、エラーを処理したい場合に有用です。Definition of signalを参照してください。
以下は、0除算の結果によるエラーを処理するために、condition-caseを使用する例です。このハンドラーは、(beepなしで)エラーメッセージを表示して、非常に大きい数をreturnします。
(defun safe-divide (dividend divisor)
(condition-case err
;; 保護されたフォーム。
(/ dividend divisor)
;; ハンドラー。 (arith-error ; Condition. ;; このエラーにたいする、通常のメッセージを表示する。 (message "%s" (error-message-string err)) 1000000))) ⇒ safe-divide
(safe-divide 5 0)
-| Arithmetic error: (arith-error)
⇒ 1000000
このハンドラーはコンディション名arith-errorを指定するので、division-by-zero(0除算)エラーだけを処理します。他の種類のエラーは(このcondition-caseによっては)、処理されません。したがって:
(safe-divide nil 3)
error→ Wrong type argument: number-or-marker-p, nil
以下は、errorによるエラーを含む、すべての種類のエラーをcatchするcondition-caseです:
(setq baz 34)
⇒ 34
(condition-case err
(if (eq baz 35)
t
;; 関数errorの呼び出し
(error "Rats! The variable %s was %s, not 35" 'baz baz))
;; フォームではないハンドラー。
(error (princ (format "The error was: %s" err))
2))
-| The error was: (error "Rats! The variable baz was 34, not 35")
⇒ 2
これは、その実行中に発生する任意のエラーを無視して、bodyの実行を構築します。その実行にエラーがなかった場合、ignore-errorsはbody内の最後のフォームの値をreturnし、それ以外はnilをreturnします。
以下は、このセクションの最初の例を、ignore-errorsを使用して記述する例です:
(ignore-errors (delete-file filename))
このマクロは、いわばignore-errorsの穏やかなバージョンです。これはエラーを完全に抑止するのではなく、エラーをメッセージに変換します。これはメッセージのフォーマットに、文字列formatを使用します。formatは、"Error:
%S"のように、単一の‘%’シーケンスを含むべきです。エラーをシグナルすると予測されないが、もし発生した場合は堅牢であるべきようなコードの周囲に、with-demoted-errorsを使用します。このマクロは、condition-caseではなく、condition-case-unless-debugを使用することに注意してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
エラーをシグナルするとき、想定するエラーの種類を指定するために、エラーシンボル(error symbol)を指定します。エラーはそれぞれ、それをカテゴリー分けするために、ただ1つのエラーシンボルをもちます。これはEmacs Lisp言語で定義されるエラーの、もっとも良い分類方法です。
これら狭義の分類は、エラー条件(error
conditions)と呼ばれる、より広義のクラス階層にグループ化され、それらはコンディション名(condition
names)により識別されます。そのようなもっとも狭義なクラスは、エラーシンボル自体に属します。つまり各エラーシンボルは、コンディション名でもあるのです。すべての種類のエラー(quitを除く)を引き受けるコンディション名errorに至る、より広義のクラスにたいするコンディション名も存在します。したがって、各エラーは1つ以上のコンディション名をもちます。つまり、error、errorとは区別されるエラーシンボル、もしかしたらその中間に分類されるものかもしれません。
シンボルをエラーシンボルとするために、シンボルは親コンディションをとるdefine-errorで定義されなければなりません。この親は、この種のエラーが属するコンディションを定義します。親の推移的な集合は、常にそのエラーシンボルと、シンボルerrorを含みます。quitはエラーと判断されないので、quitの親の集合は、単なる(quit)です。
親のコンディションに加えて、エラーシンボルはメッセージ(message)をもち、これは処理されないエラーがシグナルされたときプリントされる文字列です。そのメッセージが有効でない場合、エラーメッセージ‘peculiar error’が使用されます。Definition of signalを参照してください。
内部的には、親の集合はエラーシンボルのerror-conditionsプロパティーに格納され、メッセージはエラーシンボルのerror-messageプロパティーに格納されます。
以下は、新しいエラーシンボルnew-errorを定義する例です:
(define-error 'new-error "A new error" 'my-own-errors)
このエラーは複数のコンディション名 —
もっとも狭義の分類new-error、より広義の分類を想定するmy-own-errors、およびmy-own-errorsのコンディションすべてを含むerrorで、これはすべての中でもっとも広義なものです。
エラー文字列は大文字で開始されるべきですが、ピリオドで終了すべきではありません。これはEmacsの他の部分との整合性のためです。
もちろんEmacs自身がnew-errorをシグナルすることはありません。あなたのコード内で明示的にsignal(Definition of signalを参照してください)を呼び出すことにより、これを行なうことができるのです。
(signal 'new-error '(x y))
error→ A new error: x, y
このエラーは、エラーの任意のコンディション名により処理することができます。以下の例は、new-errorとクラスmy-own-errors内の他の任意のエラーを処理します:
(condition-case foo
(bar nil t)
(my-own-errors nil))
エラーが分類される有効な方法は、コンディション名による方法で、その名前はハンドラーのエラーのマッチに使用されます。エラーシンボルは、意図されたエラーメッセージと、コンディション名のリストを指定する便利な方法であるという役割だけです。1つのエラーシンボルではなく、コンディション名のリストをsignalに与えるのは、面倒でしょう。
対照的に、コンディション名を伴わずにエラーシンボルだけを使用した場合、それはcondition-caseの効果を著しく減少させるでしょう。コンディション名は、エラーハンドラーを記述するとき、一般性のさまざまなレベルにおいて、エラーをカテゴリー分けすることを可能にします。エラーシンボルを単独で使用することは、もっとも狭義なレベルの分類を除くすべてを捨てることです。
主要なエラーシンボルと、それらのコンディションについては、Standard Errorsを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
unwind-protect構成は、データ構造を一時的に不整合な状態に置くときは、重要です。これはエラーやthrouのイベントにより、再びデータを整合された状態にすることができます(バッファー内容の変更だけに使用される、他のクリーンアップ構成は、アトミックな変更グループです。Atomic Change Groupsを参照してください)。
unwind-protectは、制御がbody-formを離れる場合に、cleanup-formsが評価されるという保証の下、なにが起こった可に関わらず、body-formを実行します。body-formは通常どおり完了するかもしれず、unwind-protectの外でthrowが実行されたり、エラーが発生するかもしれませんが、cleanup-formsは評価されます。
body-formが正常に終了した場合、unwind-protectはcleanup-formsを評価した後で、body-formの値をreturnします。body-formが終了しなかった場合、unwind-protectは通常の意味における値は、returnしません。
unwind-protectにより保護されるのは、body-formだけです。cleanup-forms自体の任意のフォームが、(throwまたはエラーにより)非ローカルにexitした場合、unwind-protectは残りのフォームが評価されることを保証しません。cleanup-formsの中の1つが失敗することが問題となる場合は、そのフォームの周囲に他のunwind-protectを配して保護します。
現在アクティブなunwind-protectフォーム数と、ローカルの変数バインディング数の和は、max-specpdl-size(Local Variablesを参照してください)により制限されます。
たとえば、以下は一時的な使用のために不可視のバッファーを作成して、終了する前に確実にそのバッファーをkillする例です:
(let ((buffer (get-buffer-create " *temp*")))
(with-current-buffer buffer
(unwind-protect
body-form
(kill-buffer buffer))))
(kill-buffer
(current-buffer))のように記述して、変数bufferを使用せずに、同様のことを行えると思うかもしれません。しかし上の例は、別のバッファーにスイッチしたときにbody-formでエラーが発生した場合、より安全なのです(一時的なバッファーをkillするとき、そのバッファーがカレントとなることを確実にするために、かわりにbody-formの周囲にsave-current-bufferを記述することもできます)。
Emacsには、上のコードとおおよそ等しいコードに展開される、with-temp-bufferという標準マクロが含まれます(Current
Bufferを参照してください)。このマニュアル中で定義されるいくつかのマクロは、この方法でunwind-protectを使用します。
以下は、FTPパッケージ由来の、実際の例です。これは、リモートマシンへの接続の確立を試みるために、プロセス(Processesを参照してください)を作成します。関数ftp-loginは、関数のライター(writer)が予想できないことによる多くの問題から非常に影響を受けるので、失敗イベントでプロセスの削除を保証するフォームで保護されています。そうしないと、Emacsは無用なサブプロセスで一杯になってしまうでしょう。
(let ((win nil))
(unwind-protect
(progn
(setq process (ftp-setup-buffer host file))
(if (setq win (ftp-login process host user password))
(message "Logged in")
(error "Ftp login failed")))
(or win (and process (delete-process process)))))
この例には小さなバグがあります。ユーザーがquitするためにC-gとタイプした場合、関数ftp-setup-bufferがreturnした後、即座にquitが発生しますが、それは変数processがセットされる前なので、そのプロセスはkillされないでしょう。このバグを簡単に訂正する方法はありませんが、少なくともこれは非常に稀なことだと言えます。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
変数(variable)とは、プログラム内で値を表すために使用される名前です。Lispでは、変数はそれぞれLispシンボルとして表されます(Symbolsを参照してください)。変数名は単にそのシンボルの名前であり、変数の値はそのシンボルの値セル(value cell)に格納されます6。Symbol Componentsを参照してください。Emacs Lispでは、シンボルを変数として使用することは、同じシンボルを関数名として使用することと関係ありません。
このマニュアル中で前に記したとおり、Lispプログラムはまず第1にLispオブジェクトとして表され、副次的にテキストとして表現されます。Lispプログラムのテキスト的な形式は、そのプログラムを構成するLispオブジェクトの入力構文により与えられます。したがって、Lispプログラム内の変数のテキスト的な形式は、その変数を表すシンボルの入力構文を使用して記述されます。
| 11.1 Global Variables | どの場所でも永続的に存在する変数の値。 | |
| 11.2 Variables that Never Change | 変更されることのない値を持つ、ある種の"変数"。 | |
| 11.3 Local Variables | 一時的にのみ存在する存在する変数の値。 | |
| 11.4 When a Variable is “Void” | 値を持たないシンボル。 | |
| 11.5 Defining Global Variables | シンボルが変数として使用されていることを宣言する定義。 | |
| 11.6 Tips for Defining Variables Robustly | 変数を定義するときに考慮すべき事項。 | |
| 11.7 Accessing Variable Values | 実行時に判明する名前をもつ変数の値を確認する。 | |
| 11.8 Setting Variable Values | 変数に新しい値を格納する。 | |
| 11.9 Scoping Rules for Variable Bindings | Lispがローカル値とグローバル値を選択する方法。 | |
| 11.10 Buffer-Local Variables | 1つのバッファーないだけで効果をもつ変数の値。 | |
| 11.11 File Local Variables | ファイル内にリストされたローカル変数の処理。 | |
| 11.12 Directory Local Variables | ディレクトリー内のすべてのファイルで共通のローカル変数。 | |
| 11.13 Variable Aliases | 他の変数のエイリアスとなる変数。 | |
| 11.14 Variables with Restricted Values | 任意のLispオブジェクトを値とすることができない、定数ではない変数。 | |
| 11.15 Generalized Variables | 変数の概念の拡張。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
変数を使用するための一番シンプルな方法は、グローバル(globally)に使用する方法です。これは、ある時点でその変数はただ1つの値をもち、その値が(少なくともその時点では)Lispシステム全体で効果をもつことを意味します。あらたな値を指定するまで、その値が効果をもちます。新しい値で古い値を置き換えるとき、古い値を追跡する情報は変数内に残りません。
シンボルの値はsetqで指定します。たとえば、
(setq x '(a b))
これは、変数xに値(a
b)を与えます。setqはスペシャルフォームであることに注意してください。これは1番目の引数(変数の名前)は評価しませんが、2番目の引数(新しい値)は評価します。
変数が1度値をもつと、そのシンボル自身を式として使用することにより、参照することができます。したがって、
x ⇒ (a b)
これは上記のsetqフォームが実行された場合です。
同じ変数を再びセットした場合、新しい値は古い値を置き換えます:
x
⇒ (a b)
(setq x 4)
⇒ 4
x
⇒ 4
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs
Lispでは、特定のシンボルは、通常は自分自身に評価されます。これらのシンボルにはnilとt、同様に名前が‘:’で始まる任意のシンボル(これらはキーワードと呼ばれます)が含まれます。これらのシンボルは、リバインドや、値の変更はできません。nilやtへのセットやリバインドは、setting-constantエラーをシグナルします。これはキーワード(名前が‘:’で始まるシンボル)についても当てはまります。ただしキーワードが標準のobarrayにinternされている場合、そのようなシンボルを自分自身にセットしてもエラーになりません。
nil ≡ 'nil
⇒ nil
(setq nil 500) error→ Attempt to set constant symbol: nil
この関数は、objectが‘:’で始まる名前のシンボルで、標準のobarrayにinternされているの場合はt、それ以外はnilをreturnします。
これらの定数はスペシャルフォームdefconst(Defining Global Variablesを参照してください)を使用して定義された“定数(constant)”とは、根本的に異なります。defconstフォームは、人間の読み手に値の変更を意図しない変数であることを知らせる役目は果たしますが、実際にそれを変更しても、Emacsはエラーを起こしません。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
グローバル変数は、新しい値で明示的に置き換えるまで値が持続します。変数にローカル値(local value) — Lispプログラム内の特定の部分で効果をもつを与えると便利なときがあります。変数がローカル値をもつとき、わたしたちは変数がその値にローカルにバインド(locally bound)と言い、その変数をローカル変数(local variable)と呼びます。
たとえば、関数が呼び出されるとき、関数の引数となる変数はローカル値(その関数の呼び出しにおいて実際の引数に与えられた値)を受け取ります。これらのローカルバインディングは、その関数のbody内で効果をもちます。他にも、たとえばスペシャルフォームletは特定の変数にたいして明示的にローカルなバインディングを確立し、これはletフォームのbody内で効果を持ちます。
これにたいしてグローバルなバインディング(global binding)とは、(概念的には)グローバルな値が保持される場所です。
ローカルバインディングを確立すると、その変数の以前の値は他の場所に保存されます(または失われます)。わたしたちはこれを、以前の値がシャドーされた(shadowed)と言います。シャドーはグローバル変数とローカル変数の両方で発生し得ます。ローカルバインディングが効果を持つとき、ローカル変数にsetqを使用することにより、ローカルバインディングに指定された値を格納します。ローカルバインディングが効果を持たなくなったとき、以前にシャドーされた値が復元されます(または失われます)。
変数は同時に複数のローカルバインディングを持つことができます(たとえばその変数をバインドするネストされたlet)。カレントバインディング(current
binding)とは、実際に効果を持つローカルバインディングのことです。カレントバインディングは、その変数の評価によりreturnされる値を決定し、setqにより影響を受けるバインディングです。
ほとんどの用途において、“最内(innermost)”のローカルバインディング、ローカルバインディングがないときはグローバルバインディングを、カレントバインディングと考えることができます。より正確に言うと、スコープルール(scoping rule)と呼ばれるルールは、プログラム内でローカルバインディングが効果を持つ任意の与えられた場所を決定します。Emacs Lispのスコープルールはダイナミックスコープ(dynamic scoping)と呼ばれ、これは単に実行中のプログラム内の与えられた位置でのカレントバインディングを示し、その変数がまだ存在する場合は、その変数にたいしてもっとも最近作成されたバインディングです。ダイナミックスコープについての詳細と、その代替であるレキシカルスコープ(lexical scoping)と呼ばれるスコープルールについては、Scoping Rules for Variable Bindingsを参照してください。
スペシャルフォームletおよびlet*は、ローカルバインディングを作成するために存在します:
このスペシャルフォームは、bindingsにより指定される特定の変数セットにたいするローカルバインディングをセットアップしてから、formsのすべてをテキスト順に評価します。これはforms内の最後のフォームの値をreturnします。
bindingsの各バインディングは2つの形式のどちらかです。(i)
シンボルの場合。この場合、そのシンボルはnilにローカルにバインドされます。(ii)
フォーム(symbol
value-form)のリストの場合。この場合symbolはvalue-formを評価した結果にローカルにバインドされます。value-formが省略された場合は、nilが使用されます。
bindings内のすべてのvalue-formは、シンボルがそれらにバインドされる前に、記述された順番に評価されます。以下は例では、zはyの新しい場合(つまり1)にではなく、古い値(つまり2)にバインドされます。
(setq y 2)
⇒ 2
(let ((y 1)
(z y))
(list y z))
⇒ (1 2)
このスペシャルフォームはletと似ていますが、次の変数値にたいするローカル値を計算する前に、ローカル値を計算してそれを変数にバインドします。したがて、bindings内の式は、このlet*フォーム内の前のシンボルのバインドを参照できます。以下の例を、上記letの例と比較してください。
(setq y 2)
⇒ 2
(let* ((y 1)
(z y)) ; yの値に今計算されたばかりの値を使用する。
(list y z))
⇒ (1 1)
以下は、ローカルバインディングを作成する、他の機能のリストです:
変数はバッファーローカルなバインディングを持つこともできます(Buffer-Local Variablesを参照してください)。数は多くありませんが、端末ローカル(terminal-local)なバインディングをもつ変数もあります(Multiple Terminalsを参照してください)これらの種類のバインディングは、通常のローカルバインディングのように機能することもありますが、これらはEmacs内の“どこ”であるかに依存してローカライズされます。
この変数は、ローカルな変数バインディングと、unwind-protectにゆるクリーンアップ(Cleaning Up from Nonlocal
Exitsの総数にたいする制限を定義し、この変数を越えるとEmacsはエラー(データに関するエラー"Variable binding
depth exceeds max-specpdl-size")をシグナルします。
このリミットは、もし超過したときにエラーが関連付けられている場合には、誤って定義された関数による無限再起を避けるための1つの方法になります。ネストの深さにたいする他の制限としては、max-lisp-eval-depthがあります。Evalを参照してください。
デフォルト値は1300です。Lispデバッガーのエントリーしたとき、もし残りが少ないときは、デバッガーを実行するための空きを作るために、値は増加されます。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
シンボルの値セル(Symbol Componentsを参照してください)に値が割り当てられていない場合、その変数はvoid(空)であると言います。
Emacs Lispのデフォルトであるダイナミックスコープルール(see section Scoping Rules for Variable Bindings)の下では、値セルはその変数のカレント値(ローカルまたはグローバル)を保持します。値が割り当てられていない値セルは、値セルにnilをもつのとは異なることに注意してください。シンボルnilはLispオブジェクトであり、他のオブジェクトと同様に変数の値となることができます。nilは値なのです。変数がvoidの場合、その変数の評価を試みると、値をreturnするかわりに、void-variableエラーがシグナルされます。
オプションであるレキシカルスコープルール(lexical scoping rule)の下では、値セル保持できるのは、その変数のグローバル値 — 任意のレキシカルバインディング構造の外側の値だけです。変数がレキシカルにバインドされている場合、ローカル値はそのレキシカル環境により決定されます。したがって、これらのシンボルの値セルに値が割り当てられていなくても、変数はローカル値を持つことができます。
この関数は、symbolの値セルを空にして、その変数をvoidにします。この関数はsymbolをreturnします。
symbolがダイナミックなローカルバインディングを持つ場合、makunboundはカレントのバインディングをvoidにし、そのローカルバインディングが効果を持つ限りvoidにします。その後、前にシャドーされたローカル値(またはグローバル値)が再び有効になり、再び有効になった値がvoidでなければ、その変数はvoidでなくなります。
いくつか例を示します(ダイナミックバインディングが有効だとします):
(setq x 1) ; グローバルバインディングに値をセットする。 ⇒ 1 (let ((x 2)) ; それをローカルにバインドする。 (makunbound 'x) ; ローカルバインディングをvoidにする。 x) error→ Symbol's value as variable is void: x
x ; グローバルバインディングは変更されない。 ⇒ 1 (let ((x 2)) ; ローカルにバインドする。 (let ((x 3)) ; もう1度。 (makunbound 'x) ; 最内のローカルバインディングをvoidにする。 x)) ; それを参照すると、void。 error→ Symbol's value as variable is void: x
(let ((x 2))
(let ((x 3))
(makunbound 'x)) ; 内側のバインディングをvoidにしてから取り除く。
x) ; 外側のletバインディングが有効になる。
⇒ 2
この関数はvariable(シンボル)がvoidでなければtをreturnし、voidのときはnilをreturnします。
いくつか例を示します(ダイナミックバインディングが有効だとします):
(boundp 'abracadabra) ; 最初はvoid。
⇒ nil
(let ((abracadabra 5)) ; ローカルにバインドする。
(boundp 'abracadabra))
⇒ t
(boundp 'abracadabra) ; グローバルではまだvoid。
⇒ nil
(setq abracadabra 5) ; グローバルで非voidにする。
⇒ 5
(boundp 'abracadabra)
⇒ t
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
変数定義(variable
definition)とは、そのシンボルをグローバル変数として使用する意図を表明する構成です。これには以下で説明するスペシャルフォームdefvarやdefconstが使用されます。
変数宣言は3つの目的をもちます。1番目は、コードを読む人にたいして、そのシンボルが特定の方法(変数として)使用されることを意図したものだと知らせることです。2番目は、Lispシステムにたいして、オプションで初期値とドキュメント文字列を与えて、これを知らせることです。3番目は、etagsのようなプログラミングツールにたいして、その変数が定義されている場所を見つけられるように、情報を提供することです。
defconstとdefvarの違いは主に、人間の読み手に、値が変更されるかどうかを知らせることにあります。Emacs
Lispは実際、defconstで定義された変数の値の変更を妨げません。この2つのフォームの特筆すべき違いは、defconstは無条件で変数を初期化し、defvarは変数が元々voidのときだけ初期化することです。
マスタマイズ可能な変数を定義する場合は、defcustomを使用するべきです(これはサブルーチンとしてdefvarを呼び出します)。Defining Customization Variablesを参照してください。
このスペシャルフォームは、変数としてsymbolを定義します。symbolは評価されないことに注意してください。シンボルはdefvarフォーム内に明示的に表記して定義される必要があります。この変数は特別だとマークされ、これは常にそれがダイナミックにバインドされることを意味します(Scoping Rules for Variable Bindingsを参照してください)。
valueが指定されていてsymbolがvoid(たとえばこのシンボルがダイナミックにバインドされた値を持たないとき。When a Variable is “Void”を参照してください)、valueが評価されて、その結果がsymbolにセットされます。しかしsymbolがvoidでな場合、valueは評価されず、symbolの値は変更されません。valueが省略された場合、いかなる場合もsymbolの値は変更されません。
symbolがカレントバッファー内でバッファーローカルなバインディングをもつ場合、defvarはデフォルト値に作用します。デフォルト値はバッファーローカルなバインディングではなく、バッファーにたいして独立しています。デフォルト値がvoidのときはデフォルト値をセットします。Buffer-Local Variablesを参照してください。
すでにsymbolがレキシカルにバインドされている場合(たとえばレキシカルバインドが有効な状態でletフォーム内にdefvarがあるような場合)、defvarはダイナミックな値をセットします。バインディング構造を抜けるまで、レキシカルバインディングは効果をもちます。Scoping Rules for Variable Bindingsを参照してください。
Emacs
Lispモード(eval-defun)でトップレベルのdefvarを評価するとき、eval-defunの特別な機能は、その値がvoidであるかテストすることなく、その変数を無条件にセットします。
引数doc-stringが与えられた場合、それは変数にたいするドキュメント文字列を指定します(そのシンボルのvariable-documentationプロパティーに格納されます)。Documentationを参照してください。
以下にいくつか例を示します。これはfooを定義しますが、初期化は行いません:
(defvar foo)
⇒ foo
この例はbarの値を23に初期化して、ドキュメント文字列を与えます:
(defvar bar 23
"The normal weight of a bar.")
⇒ bar
defvarフォームはsymbolをreturnしますが、通常これは値が問題にならないファイル内のトップレベルで使用されます。
このスペシャルフォームは、ある値としてsymbolを定義して、それを初期化します。これはコードを読む人に、symbolがここで設定される標準的なグローバル値をもち、ユーザーや他のプログラムがそれを変更すべきではないことを知らせます。symbolは評価されないことに注意してください。このシンボルは、defconst内に明示的に記されなければなりません。
defvarと同様、defconstは、変数を特別 —
この変数が常にダイナミックにバインドされているという意味 — だとマークします(Scoping Rules for Variable Bindingsを参照してください)。加えて、これはその変数を危険であるとマークします(File Local Variablesを参照してください)。
defconstは常にvalueを評価して、その結果をsymbolの値にセットします。カレントバッファー内でsymbolがバッファーローカルなバインディングをもつ場合、defconstはデフォルト値ではなく、バッファーローカルな値をセットします(しかし、defconstで定義されたシンボルにたいしてバッファーローカルなバインディングを作るべきではありません)。
defconstの使い方の例は、Emacsのfloat-pi — (たとえIndiana State
Legislatureが何を試みようと)何者かにより変更されるべきではない、数学定数piにたいする定義です。しかし2番目のdefconstの例のように、これは単にアドバイス的なものです。
(defconst float-pi 3.141592653589793 "The value of Pi.")
⇒ float-pi
(setq float-pi 3)
⇒ float-pi
float-pi
⇒ 3
警告:
変数がローカルバインディングをもつとき(letにより作成された、または関数の引数の場合)に、スペシャルフォームdefconstまたはdefvarを使用すると、これらのフォームはグローバルバインディングではなく、ローカルバインディングをセットします。これは通常、あなたが望むことではないはずです。これを防ぐには、これらのスペシャルフォームをファイル内のトップレベルで使用します。この場所は通常、何のローカルバインディングも効果をもたないので、その変数にたいするローカルバインディングが作成される前にファイルがロードされることが確実だからです。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
値が関数(または関数のリスト)であるような変数を定義するとき、変数の名前の最後に‘-function’(または‘-functions’)を使います。
他にも、変数名に関する慣習があります。以下はその完全なリストです:
変数はノーマルフックです(Hooksを参照してください)。
値は関数です。
値は関数のリストです。
値はフォーム(式)です。
値はフォーム(式)のリストです。
値は述語(predicate) — 1つの引数をとる関数 —
で、引数が“正しい(good)”"場合は非nil、“正しくない(bad)”場合はnilをreturnします。
nilか、そうでないかだけが意味をもつような値です。そのような変数は結局、やがては多くの値をもつことが多いので、この慣習を強く推奨はしません。
値はプログラム名です。
値は完全なシェルコマンドです。
値はコマンドにたいして指定するオプションです。
変数を定義するときは、その変数を“安全(safe)”とマークすべきか、それとも“危険(risky)”とマークすべきかを常に考慮してください。File Local Variablesを参照してください。
複雑な値を保持する変数(バインディングをもつkeymapなど)を定義、または初期化するとき、以下のように値の計算をすべてdefvarの中に配置するのが最良です:
(defvar my-mode-map
(let ((map (make-sparse-keymap)))
(define-key map "\C-c\C-a" 'my-command)
…
map)
docstring)
この方法にはいくつかの利点があります。1つ目は、ファールをロード中にユーザーが中断した場合、変数はまだ初期化されていないか、初期化されているかのどちらかで、その中間ということはありません。まだ初期化されていない場合、ファイルをリロードすれば正しく初期化されます。2つ目は、1度初期化された変数は、ファイルをリロードしても変更されないことです。コンテンツの一部を変更(たとえばキーのリバインド)するフックをユーザーが実行した場合などに、これは重要です。3つ目は、C-M-xでdefvarを評価すると、そのマップは完全に再初期化されることです。
defvarフォーム内に多すぎるコードを配置することには不利な点が1つあります。ドキュメント文字列が変数の名前から離れた場所に配置されることです。これを避ける安全な方法は以下の方法です:
(defvar my-mode-map nil
docstring)
(unless my-mode-map
(let ((map (make-sparse-keymap)))
(define-key map "\C-c\C-a" 'my-command)
…
(setq my-mode-map map)))
これは初期化をdefvarの内側に配置した場合とまったく同じ利点をもちますが、変数を再度初期化したい場合は、各フォームにたいして1回ずつ、2度C-M-xをタイプしなければならない点が異なります。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
変数を参照する通常の方法は、それに名前をつけるシンボルを記述する方法です。The usual way to reference a variable is to write the symbol which names it. Symbol Formsを参照してください。
時には、実行時にのみ決定される変数を参照したいときがあるかもしれません。そのような場合、プログラム中のテキストで、変数名を指定することはできません。その値を抽出するために、symbol-valueを使うことができます。
この関数は、symbolの値セルに格納された値をreturnします。これには、その変数の(ダイナミックな)カレント値が格納された場所です。その変数がローカルバインディングをもたない場合は、単にその変数のグローバル値になります。変数がvoidの場合、void-variableはエラーをシグナルします。
その変数がレキシカルにバインドされている場合、symbol-valueにより報告される値は、その変数のレキシカル値と同じである必要はありません。レキシカル値はそのシンボルの値セルではなく、レキシカル環境により決定されます。Scoping Rules for Variable Bindingsを参照してください。
(setq abracadabra 5)
⇒ 5
(setq foo 9)
⇒ 9
;; ここでシンボルabracadabraは
;; 値がテストされるシンボル。
(let ((abracadabra 'foo))
(symbol-value 'abracadabra))
⇒ foo
;; ここでは、abracadabraの値、 ;; つまりfooが、 ;; 値をテストされるシンボル。 (let ((abracadabra 'foo)) (symbol-value abracadabra)) ⇒ 9
(symbol-value 'abracadabra)
⇒ 5
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ある変数の値を変更する通常の方法は、スペシャルフォームsetqを使用する方法です。実行時に変数選択を計算する必要がある場合は、関数setを使用します。
このスペシャルフォームは、変数の値を変更するための、もっとも一般的な方法です。symbolにはそれぞれ、新しい値(対応するformが評価された結果)を与えられます。そのシンボルのカレントバインディングは変更されます。
setqはsymbolを評価せず、記述されたシンボルをセットします。この引数のことを、自動的にクォートされた(automatically
quoted)と呼びます。setqの‘q’は、“quoted(クォートされた)”が由来です。
setqフォームの値は、最後のformの値となります。
(setq x (1+ 2))
⇒ 3
x ; ここでxはグローバル値をもつ。
⇒ 3
(let ((x 5))
(setq x 6) ; xのローカルバインディングをセット。
x)
⇒ 6
x ; グローバル値は変更されない。
⇒ 3
1番目のformが評価されてから1番目のsymbolがセットされ、次に2番目のformが評価されてからsymbolが評価されて、...となることに注意してください:
(setq x 10 ; ここで、xがセットされるのは y (1+ x)) ;yの計算前であることに注目。 ⇒ 11
この関数は、symbolの値セルにvalueを配置します。これはスペシャルフォームではなく関数なので、シンボルにセットするために、symbolに記述された式は評価されます。return値はvalueです。
ダイナミックな変数バインドが有効な場合(デフォルト)、setは自身の引数symbolを評価しますが、setqは評価しないという点を除き、setはsetqと同じ効果をもちます。しかし、変数がレキシカルバインドの場合、setは変数のダイナミックな値に影響し、setqは変数のカレント値(レキシカル値)に影響します。Scoping Rules for Variable Bindingsを参照してください。
(set one 1) error→ Symbol's value as variable is void: one
(set 'one 1)
⇒ 1
(set 'two 'one)
⇒ one
(set two 2) ; twoは、シンボルoneに評価される。
⇒ 2
one ; したがってoneがセットされる。 ⇒ 2 (let ((one 1)) ;oneのこのバインディングがセットされるのであって (set 'one 3) ; グローバル値はセットされない。 one) ⇒ 3
one
⇒ 2
symbolが実際のシンボルでない場合、wrong-type-argumentエラーがシグナルされます。
(set '(x y) 'z) error→ Wrong type argument: symbolp, (x y)
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ある変数にたいするローカルバインディングを作成するとき、そのバインディングはプログラムの限られた一部だけに効果をもちます(see section Local Variables)。このセクションでは、これが正確には何を意味するかについて説明します。
ローカルバインディングはそれぞれ、個別にスコープ(scope: 範囲という意味)とエクステント(extent: これも範囲を意味する)をもちます。スコープは、そのバインディングにアクセスできるのが、テキストのソースコードのどこ(where)であるかを示します。エクステントは、プログラムの実行中に、そのバインディングが存在するのがいつ(when)であるかを示します。
デフォルトでは、Emacsが作成したローカルバインディングは、ダイナミックバインディング(dynamic
binding)です。このようなバインディングは、ダイナミックスコープ(dynamic
scope)をもち、それはプログラムの任意の範囲が、その変数バインディングにアクセスするかもしれないことを意味します。これはダイナミックエクステント(dynamic
extent)ももちます。これはそのバインディング構造(letフォームのbodyなど)が実行される間だけ、そのバインディングが存続することを意味します。
Emacsはオプションでレキシカルバインディング(lexical binding)を作成することができます。レキシカルバインディングはレキシカルスコープ(lexical scope)をもち、これはその変数にたいする任意の参照が、バインディング構造内にテキスト的に配置されなければならないことを意味します7。レキシカルバインディングは不定エクステント(indefinite extent)ももちます。これは、ある状況下において、クロージャー(closures)と呼ばれるスペシャルオブジェクトにより、バインディング構造が実行を終えた後でさえも、存続を続けることを意味します。
以降のサブセクションでは、ダイナミックバインディングとレキシカルバインディング、およびEmacs Lispプログラムでレキシカルバインディングを有効にする方法について、より詳細に説明します。
| 11.9.1 Dynamic Binding | Emacs内でのローカル変数にたいするデフォルトのバインディング。 | |
| 11.9.2 Proper Use of Dynamic Binding | ダイナミックバインディングによる問題を回避する。 | |
| 11.9.3 Lexical Binding | ローカル変数にたいする他の種類のバインディング。 | |
| 11.9.4 Using Lexical Binding | レキシカルバインディングを有効にする方法。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
デフォルトでは、Emacsにより作成されるローカル変数のバインディングは、ダイナミックバインディングです。ある変数がダイナミックにバインドされていると、Lispプログラムの実行における任意のポイントでのカレントバインディングは、単にそのシンボルにたいしてもっとも最近作成されたダイナミックなローカルバインディングか、そのようなローカルバインディングが存在しない場合はグローバルバインディングになります。
以下の例のように、ダイナミックバインディングはダイナミックスコープとダイナミック<エクステントをもちます:
(defvar x -99) ;xは初期値として-99を受け取る。 (defun getx () x) ; この関数内では、xは“自由”に使用される。 (let ((x 1)) ;xはダイナミックにバインドされている。 (getx)) ⇒ 1 ;;letフォームが終了した後、 ;;xは前の値-99にリバートされる。 (getx) ⇒ -99
関数getxはxを参照します。defun構造自体の中にxにたいするバインディングが存在しないと意味において、これは“自由”な参照です。xが(ダイナミックに)バインドされているletフォーム内からgetxを呼び出すと、ローカル値(つまり1)が取得されます。しかし、その後letフォームの外側からgetxを呼び出すと、グローバル値(つまり-99)が取得されます。
以下は、setqを使用してダイナミックに変数をバインドする、例をです:
(defvar x -99) ;xは初期値として-99を受け取る。 (defun addx () (setq x (1+ x))) ;xに1追加して、新しい値をreturnする。 (let ((x 1)) (addx) (addx)) ⇒ 3 ;addxを2回呼び出すと、xに2回追加される。 ;;letフォームが終了した後、 ;;xは前の値-99にリバートされる。 (addx) ⇒ -98
Emacs Lispでは、ダイナミックバインディングは、シンプルな方法で実装されています。それぞれのシンボルは、シンボルのカレントのダイナミック値(または値の不在)を指定する値セルをもちます。Symbol Componentsを参照してください。あるシンボルがダイナミックなローカル値を与えられたとき、Emacsは値セルの内容(または値の不在)をスタックに記録し、新しいローカル値を値セルに格納します。バインディング構造が実行を終えたとき、Emacsはスタックから古い値をpopして、値セルにそれを置きます。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ダイナミックバインディングは、プログラムにたいしてテキスト的なローカルスコープ内で定義されていない変数を参照することを許す、強力な機能です。しかし、無制限に使用した場合は、プログラムの理解しにくくしてしまうこともあります。このテクニックを使用するために、2つの明解な方法があります:
letフォームのbodyなどの場所)でそれを使用します。プログラムでこの慣習に一貫してしたがえば、プログラム内の他の場所の同じ変数シンボルの任意の使用が、その変数の値に影響を与えたり、影響を受けることがなくなります。
defvar、defconst、defcustomで変数を定義します。Defining Global Variablesを参照してください。この定義は通常、Emacs
Lispファイル内のトップレベルにあるべきです。この定義には可能な限り、変数の意味と目的を説明するドキュメント文字列を含めるべきです。名前の衝突を避けるように、変数を命名することも行うべきです(Emacs Lisp Coding Conventionsを参照してください)。
その後は、プログラム内のどこか別の場所で、それが何に影響するか確信をもって、変数をバインドすることができます。その変数にどこで出会っても、(たとえば、変数の定義がEmacsにロードされていれば、C-h vコマンドを通じて)定義を参照するのが簡単になります。Name Help in The GNU Emacs Manualを参照してください。
たとえば、case-fold-searchのようなカスタマイズ可能な変数にたいしてローカルバインディングを使用するのは一般的です:
(defun search-for-abc ()
"Search for the string \"abc\", ignoring case differences."
(let ((case-fold-search nil))
(re-search-forward "abc")))
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacsのバージョン24.1から、オプションの機能としてレキシカルバインディングが導入されました。わたしたちは、この機能の重要さが、将来において重要になることを期待します。レキシカルバインディングは最適化の機会をより広げるので、この機能を使用するプログラムはおそらく、将来のEmacsバージョンで高速に実行されるようになるでしょう。レキシカルバインディングは、わたしたちがEmacsに将来追加したいと考える並列性(concurrency)とも互換をもっています。
レキシカルにバインドされた変数はレキシカルスコープ(lexical scope)をもいます。 これは、その変数にたいする参照は、そのバインディング構造内にテキスト的に配置されなければならないことを意味します。以下は例です (実際にレキシカルバインディングを有功にする方法は、Using Lexical Bindingを参照してください):
(let ((x 1)) ;xはレキシカルにバインドされる。 (+ x 3)) ⇒ 4 (defun getx () x) ; この関数内では、xは“自由”に使用される。 (let ((x 1)) ;xはレキシカルにバインドされる。 (getx)) error→ Symbol's value as variable is void: x
ここでは、xはグローバル値をもちません。letフォーム内でレキシカルにバインドされたとき、この変数はletのテキスト境界内で使用できます。しかし、このlet内から呼び出されるgetx関数からは、getxの関数定義がletフォームの外側にあるので、使用することができません。
レキシカルバインディングが機能する方法を説明します。各バインディング構造は、その構造および構造のローカル値でバインドされるシンボルを指定することにより、レキシカル環境(lexical environment)を定義します。Lispの評価機能(Lisp evaluator)がある変数のカレント値を得たいときは、最初にレキシカル環境内を探します。そこで変数が指定されていなければ、ダイナミック値が格納されるシンボルの値セルを探します。
(内部的には、レキシカル環境はシンボルと値がペアになったalistで、alistの最後の要素はコンスセルではなく、シンボルtです。そのようなalistは、フォームを評価するためのレキシカル環境を指定するために、eval関数の2番目の引数として渡すことができます。Evalを参照してください。しかし、ほとんどのEmacs
Lispプログラムは、この方法で直接レキシカル環境を使用するべきではありません。デバッガーのような特化されたプログラムだけが使用すべきです。)
レキシカルバインディングは、不定エクステント(indefinite extent)をもちます。バインディング構造が終了した後でも、そのレキシカル環境はクロージャー(closures)と呼ばれるLispオブジェクト内に“保持”されます。クロージャーは、レキシカルバインディングが有効な、名前つきまたは無名(anonymous)の関数が作成されたときに作成されます。詳細は、Closuresを参照してください。
クロージャーが関数として呼び出されたとき、その関数の定義内のレキシカル変数にたいする任意の参照は、レキシカル環境を維持するために使用されます。以下は例です:
(defvar my-ticker nil) ; クロージャーを格納するために ; この変数を使用する。 (let ((x 0)) ;xはレキシカルにバインドされる。 (setq my-ticker (lambda () (setq x (1+ x))))) ⇒ (closure ((x . 0) t) () (setq x (1+ x))) (funcall my-ticker) ⇒ 1 (funcall my-ticker) ⇒ 2 (funcall my-ticker) ⇒ 3 x ;xはグローバル値をもたないことに注意。 error→ Symbol's value as variable is void: x
letバインディングは、内部に変数xをもつレキシカル環境を定義し、これは0にローカルにバインドされます。このバインディング構造内で、xを1層化し、増加された値をreturnするクロージャーを定義しています。このラムダ式は自動的にクロージャーになり、たとえlet構造を抜けた後でも、その内部ではレキシカル環境が存続します。クロージャーを評価するときは毎回、レキシカル環境内のxのバインディングが使用され、xが増加されます。
symbol-value、boundp、setのような関数は、変数のダイナミックバインディング(つまりそのシンボルの値セル)だけを取得(または変更)することに注意してください。defun(またはdefmacro)のbody内のコードも、周囲のレキシカル変数は参照できません。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs
Lispファイルをロードしたり、Lispバッファーを評価するとき、バッファーローカルな変数lexical-bindingが非nilの場合は、レキシカルバインディングが有効になります:
このバッファーローカルな変数が非nilの場合、Emacs
Lispファイルおよびバッファーは、ダイナミックバインディングではなくレキシカルバインディングを使用して評価されます(しかし、特別な変数はダイナミックにバインドされたままです。以下を参照してください)。nilの場合、すべてのローカル変数にたいしてダイナミックバインディングが使用されます。この変数は通常、ファイルローカル変数として、Emacs
Lispファイル全体にたいしてセットされます(File Local Variablesを参照してください)。他のファイルローカル変数などとは異なり、ファイルの最初の行でセットされなければならないことに注意してください。
eval呼び出しを使用して、Emacs
Lispコードを直接評価するとき、evalのlexical引数が非nilの場合は、レキシカルバインディングが有効になります。Evalを参照してください。
レキシカルバインディングが有効な場合でも、特定の変数はダイナミックにバインドされたままです。これらはスペシャル変数(special
variable)と呼ばれます。defvar、defcustom、defconstで定義されたすべての変数は、スペシャル変数です(Defining Global Variablesを参照してください)。その他のすべての変数はレキシカルバインディングの対象になります。
この関数は、symbolがスペシャル変数(つまり変数がdefvar、defcustom、defconstによる定義をもつ)の場合は非nilをreturnします。それ以外では、return値はnilになります。
関数内での通常の引数としてスペシャル変数を使用することは、推奨されません。レキシカルバインディングモードが有効なときにこれを行うと、不定な動作が起こります(あるときはレキシカルバインディング、またあるときはダイナミックバインディングのように)。
Emacs Lispプログラムをレキシカルバインディングに変換するのは簡単です。最初にEmacs
Lispソースファイルのヘッダー行でlexical-bindingをtして、ファイルローカル変数を追加します(File Local Variablesを参照してください)。次に、意図せずレキシカルにバインドしてしまわないように、ダイナミックなバインドをもつ必要がある変数が変数定義をもつことを、各変数ごとにチェックします。
どの変数が変数定義をもつ必要があるか見つけるシンプルな方法は、ソースファイルをバイトコンパイルすることです。Byte Compilationを参照してください。letフォームの外で非スペシャル変数が使用されている場合、バイトコンパイラーは“free
variable”にたいする参照または割り当てについて警告するでしょう。非スペシャル変数がバインドされているが、letフォーム内で使用されていない場合、バイトコンパイラーは“unused
lexical
variable”に関して警告するでしょう。バイトコンパイラーは、スペシャル変数を関数の引数として使用している場合も、問題を警告します。
(使用されていない変数についての警告を抑制するためには、単に変数名をアンダースコアーで開始します。そうすれば、バイトコンパイラーはこれを、変数が使用されないことを示すと解釈します。)
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
グローバルおよびボーカルな変数バインディングは、1つの形式、または別の形式で、ほとんどのプログラミング言語で見つけることができます。しかしEmacsは、1つのバッファーだけに適用されるバッファーローカル(buffer-local)なバインディングの用に、普通にはない種類の変数バインディングもサポートします。ある変数にたいして異なるバッファーごとに別の亜Q体をもつのは、重要なカスタマイズ方法です(変数は端末ごとにローカルなバインディングをもつこともできます。Multiple Terminalsを参照してください)。
| 11.10.1 Introduction to Buffer-Local Variables | イントロダクションと概念。 | |
| 11.10.2 Creating and Deleting Buffer-Local Bindings | バッファーローカルなバインディングの作成と削除。 | |
| 11.10.3 The Default Value of a Buffer-Local Variable | 自身ではバッファーローカルな値をもたないバッファーで参照されるデフォルト値。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バッファーローカル変数は、特定のバッファーに関連づけられた、バッファーローカルなバインディングをもちます。このバインディングは、そのバッファーがカレントのときに効果をもち、カレントでないときは効果がありません。バッファーローカルなバインディングが効力をもつときにその変数をセットした場合、そのバインディングは新しい値をもちますが、他のバインディングは変更されません。これは、バッファーローカルなバインディングを作成したバッファーだけで変更が見えることを意味します。
その変数にたいする特定のバッファーに関連づけられていない通常のバインディングは、デフォルトバインディング(default binding)と呼ばれます。ほとんどの場合、これはグローバルバインディングです。
変数は、あるバッファーではバッファーローカルなバインディングをもつことができ、他のバッファーではもたないことができます。デフォルトバインディングは、その変数にたいして自身のバインディングをもたない、すべてのバッファーで共有されます(これには、新たに作成されたバッファーが含まれます)。ある変数にたいしてバッファーローカルなバインディングをもたないバッファーでその変数をセットすると、デフォルトバインディングがセットされるので、それはデフォルトバインディングを参照するすべてのバッファーで新しい値を見ることができます。
バッファーローカルなバインディングのもっとも一般的な使用は、目はーモードがコマンドの動作を制御するために変数を変更する場合です。たとえばCモードやLispモードは、空行だけがパラグラフの区切りになるように、変数paragraph-startをセットします。これらのモードは、CモードやLispモードになるようなバッファー内でこの変数をバッファーローカルにすることによりこれを行い、その後そのモードにたいして新しい値をセットします。Major Modesを参照してください。
バッファーローカルなバインディングを作成する通常の方法は、make-local-variableによる方法で、これは通常メジャーモードが使用します。これはカレントバッファーだけに効果があります。その他すべてのバッファー(まだ作成されていないバッファーを含む)は、それらのバッファー自身が明示的にバッファーローカルなバインディングを与えられるまで、デフォルト値の共有を続けます。
変数を自動的にバッファーローカルになるようにマークする、より強力な操作は、make-variable-buffer-localを呼び出すことにより行われます。これは、たとえその変数がまだ作成されていなくても、変数をすべてのバッファーにたいしてローカルにすると考えることができます。より正確には、変数を自動的にセットすることにより、その変数がカレントバッファーにたいしてローカルでなくても、変数をローカルにする効果があります。すべてのバッファーは最初は通常のようにデフォルト値を共有しますが、この変数をセットすることによりカレントバッファーにたいしてバッファーローカルなバインディングを作成します。新たな値はバッファーローカルなバインディングに格納され、デフォルトバインディングは変更されずに残ります。これは、任意のバッファーでsetqによりデフォルト値を変更できないことを意味します。変更する唯一の方法は、setq-defaultだけです。
警告:
ある変数が1つ以上のバッファーでバッファーローカルなバインディングをもつとき、letはそのとき効果をもつ変数のバインディングをリバインドします。たとえばq、カレントバッファーがバッファーローカルな値をもつ場合、letは一時的にそれをリバインドします。効果をもつバッファーローカルなバインディングが存在しない場合、letはデフォルト値をリバインドします。letの内部で、別のバインディングが効力をもつ別のバッファーをカレントバッファーにすると、それ以上letバインディングを参照できなくなります。他のバッファーにいる間にletを抜けると、(たとえそれが正しくても)バインディングの解消を見ることはできません。以下にこれを示します:
(setq foo 'g) (set-buffer "a") (make-local-variable 'foo)
(setq foo 'a) (let ((foo 'temp)) ;; foo ⇒ 'temp ; バッファー‘a’内でのletバインディング (set-buffer "b") ;; foo ⇒ 'g ; fooは‘b’にたいしてローカルではないためグローバル値 body…)
foo ⇒ 'g ; exitによりバッファー‘a’のローカル値が復元されるが、 ; バッファー‘b’では見ることができない
(set-buffer "a") ; ローカル値が復元されたことを確認
foo ⇒ 'a
body内のfooにたいする参照は、バッファー‘b’のバッファーローカルなバインディングにアクセスすることに注意してください。
あるファイルがローカル変数の値をセットする場合、これらの変数はファイルをvisitするときバッファーローカルな値になります。File Variables in The GNU Emacs Manualを参照してください。
バッファーローカル変数を、端末ローカル(terminal-local)にすることはできません(Multiple Terminalsを参照してください)。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この関数はカレントバッファー内で、variable(シンボル)にたいして、バッファーローカルなバインディングを作成します。他のバッファーは影響を受けません。returnされる値は、variableです。
variableのバッファーローカルな値は最初、以前にvariableがもっていた値と同じ値をもちます。variableがvoidのときは、voidのままです。
;; バッファー‘b1’で行う: (setq foo 5) ; すべてのバッファーに影響する。 ⇒ 5
(make-local-variable 'foo) ; ‘b1’内でローカルになった。
⇒ foo
foo ; 値は変更されない。
⇒ 5
(setq foo 6) ; ‘b1’内で値を変更。
⇒ 6
foo
⇒ 6
;; バッファー‘b2’では、値は変更されていない。
(with-current-buffer "b2"
foo)
⇒ 5
変数をletバインディングでバッファーローカルにしても、letへの出入り時の両方で、これを行うバッファーがカレントでない場合は、信頼性がありません。これはletがバインディングの種類を区別しないからです。letはバインディングを作成される変数だけを知るからです。
変数が端末ローカル(Multiple Terminalsを参照してください)の場合、この関数はエラーをシグナルします。そのような変数は、バッファーローカルなバインディングをもつことができません。
警告:
フック変数にたいしてmake-local-variableを使用しないでください。フック変数は、add-hookまたはremove-hookのlocal引数を使用した場合、必要に応じて自動的にバッファーローカルになります。
このマクロはカレントバッファー内でvariableにたいしてバッファーローカルなバインディングを作成して、それにバッファーローカルな値valueを与えます。このマクロはmake-local-variableに続けてsetqを呼び出すのと同じです。variableはクォートされていないシンボルです。
このコマンドは、variable(シンボル)が自動的にバッファーローカルになるようにマークするので、それ以降にその変数へのセットを試みると、その時点でカレントのバッファーにローカルになります。しばしば混乱を招くmake-local-variableとは異なり、これが取り消されることはなく、すべてのバッファー内での変数の挙動に影響します。
この機能に特有の欠点は、(letまたはその他のバインディング構造による)変数のバインディングが、その変数にたいするバッファーローカルなバインディングを作成しないことです。(setまたはsetqによる)変数のセットだけは、その変数がカレントバッファーで作成されたletスタイルのバインディングをもたないので、ローカルなバインディングを作成します。
variableがデフォルト値をもたない場合、このコマンドの呼び出しはnilのデフォルト値を与えます。variableがすでにデフォルト値をもつ場合、その値は変更されずに残ります。それ以降にvariableにたいしてmakunboundを呼び出すと、バッファーローカル値をvoidにして、デフォルト値は影響を受けずに残ります。
return値はvariableです。
警告:
ユーザーオプション変数にたいしては、ユーザーは異なるバッファーにたいして異なるカスタマイズを望むかもしれないので、make-variable-buffer-localを使うべきだと決め込むべきではありません。ユーザーは、望むなら任意の変数をローカルにできます。それらの選択の余地を残すほうがよいでしょう。
make-variable-buffer-localを使用すべきときは、複数のバッファーが同じバインディングを共有しないことが自明な場合です。たとえば、バッファーごとに個別な値をもつことに依存するLispプログラム内の内部プロセスにたいして変数が使用されるときは、make-variable-buffer-localの使用が最善の解決策になるかもしれません。
このマクロはvariableを、初期値valueおよびdocstringの変数として定義して、それを自動的にバッファーローカルとマークします。これはdefvarの後につづけてmake-variable-buffer-localを呼び出すのと同じです。variableはクォートされていないシンボルです。
これはvariableがバッファーbuffer(デフォルトはカレントバッファー)内でバッファーローカルのときはt、それ以外はnilをreturnします。
これはvariableがバッファーbuffer内でバッファーローカル値をもつか、自動的にバッファーローカルになる場合は、tをreturnします。それ以外はnilをreturnします。bufferが省略またはnilの場合のデフォルトは、カレントバッファーです。
この関数は、バッファーbuffer内の、variable(シンボル)のバッファーローカルなバインディングをreturnします。variableがバッファーbuffer内でバッファーローカルなバインディングをもたない場合は、かわりにvariableのデフォルト値(The Default Value of a Buffer-Local Variable)をreturnします。
この関数はバッファーbuffer内のバッファーローカル変数を表すリストをreturnします(bufferが省略された場合はカレントバッファーが使用されます)。リストの各要素は通常、(sym . val)という形式をもちます。ここでsymはバッファーローカル変数(シンボル)、valはバッファーローカル値です。しかしbuffer内の、ある変数のバッファーローカルなバインディングがvoidのtきは、その変数に対応するリスト要素は単にsymになります。
(make-local-variable 'foobar) (makunbound 'foobar) (make-local-variable 'bind-me) (setq bind-me 69)
(setq lcl (buffer-local-variables))
;; 最初はすべてのバッファー内でローカルなビルトイン変数:
⇒ ((mark-active . nil)
(buffer-undo-list . nil)
(mode-name . "Fundamental")
…
;; 次にビルトインでないバッファーローカル変数。 ;; This one is buffer-local and void: foobar ;; これはバッファーローカルでvoidではない: (bind-me . 69))
このリスト内のコンスセルのCDRに新たな値を格納しても、その変数のバッファーローカル値は変化しないことに注意してください。
この関数はカレントバッファー内のvariable(シンボル)にたいするバッファーローカルなバインディング(もしあれば)を削除します。その結果として、このバッファー内でvariableのデフォルトバインディングが可視になります。これは通常、variableの値を変更します。デフォルト値は削除されたバッファーローカル値とは異なるのが普通だからです。
セットしたとき自動的にバッファーローカルになる変数のバッファーローカルなバインディングをkillした場合は、これによりカレントバッファーな意でデフォルト値が可視になります。しかし、変数を再度セットすると、その変数にたいするバッファーローカルなバインディングが再作成されます。
kill-local-variableはvariableをreturnします。
この関数はコマンドです。なぜなら、バッファーローカル変数のインタラクティブな作成が有用な場合があるように、あるバッファーローカル変数のインタラクティブなkillが有用な場合があるからです。
この関数は、“permanent(永続的)”とマークされた変数、およびpermanent-local-hookプロパティーに非nilをもつローカルフック関数(Setting Hooks)を除き、カレントバッファーのすべてのバッファーローカルなバインディングを解消します。結果として、そのバッファーはほとんどの変数のデフォルト値を参照するようになります。
この関数は、そのバッファーに関係のあるその他の特定の情報もリセットします。これはローカルキーマップ(local
keymap)をnil、構文テーブル(syntax
table)を(standard-syntax-table)の値、大文字小文字テーブル(case
table)を(standard-case-table)、abbrevテーブル(abbrev
table)をfundamental-mode-abbrev-tableの値にセットします。
この関数が1番最初に行うのは、ノーマルフックchange-major-mode-hook(以下参照)の実行です。
各メジャーモードコマンドは、Fundamentalモードにスイッチする効果をもち、以前のメジャーモードのほとんどの効果を消去する、この関数を呼び出すことにより開始されます。この関数が処理を行うのを確実にするために、メジャーモードがセットする変数はpermanentとマークすべきではありません。
kill-all-local-variables returns nil.
関数kill-all-local-variablesは、何か他のことを行う前に、まずこのノーマルフックを実行します。この関数はメジャーモードにたいして、ユーザーが他のメジャーモードにスイッチした場合に行われる、何か特別なことを準備する方法を与えます。この関数は、ユーザーがメジャーモードを変更した場合に忘れられるべき、バッファー固有のマイナーモードにたいしても有用です。
最善の結果を得るために、この変数をバッファーローカルにすれば、処理が終了したときに消えるので、以降のメジャーモードに干渉しなくなります。Hooksを参照してください。
変数名(シンボル)が非nilのpermanent-localプロパティーをもつ場合、バッファーローカル変数はpermanent(永続的)です。そのような変数はkill-all-local-variablesの影響を受けず、したがってメジャーモードの変更によりそれらのローカルバインディングは作成されません。permanentなローカル変数は、ファイルの内容を編集する方法などより、どこから読み込んだファイルか、あるいはどのように保存するかといったことに関連するデータに適しています。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バッファーローカルなバインディングをもつ変数のグローバル値も、デフォルト値(default)値と呼ばれます。なぜなら、その変数にたいしてカレントバッファーも選択されたフレームもバインディングをもたない場合には、その値が常に効果をもつからです。
関数default-valueおよびsetq-defaultは、カレントバッファーがバッファーローカルなバインディングをもつかどうかに関わらず、その変数のデフォルト値にアクセスまたは変更します。たとえば、ほとんどのバッファーにたいして、paragraph-startのデフォルトのセッティングを変更するために、setq-defaultを使用できます。そして、この変数にたいするバッファーローカルな値をもつCモードやLispモードにいるときでさえ、これは機能します。
スペシャルフォームdefvarおよびdefconstも、バッファーローカルな値ではなく、(もし変数にセットする場合は)デフォルト値をセットします。
この関数は、symbolのデフォルト値をreturnします。これは、この変数にたいして独自の値をもたないバッファーやフレームから参照される値です。symbolがバッファーローカルでない場合、これはsymbol-value(Accessing Variable Valuesを参照してください)と同じです。
関数default-boundpは、symbolのデフォルト値がvoidでないか報告します。(default-boundp
'foo)がnilをreturnした場合、(default-value 'foo)はエラーになります。
default-boundpはdefault-valueんびたいして、boundpはsymbol-valueにたいする述語です。
このスペシャルフォームは、各symbolに、対応するformを評価した結果を新たなデフォルト値として与えます。これはsymbolを評価しませんが、formは評価します。setq-defaultフォームの値は、最後のformの値です。
カレントバッファーにたいしてsymbolがバッファーローカルでなく、自動的にバッファーローカルにマークされない場合、setq-defaultはsetqと同じ効果をもちます。カレントバッファーにたいしてsymbolがバッファーローカルな場合、これは他のバッファーから参照できる値を変更します(それらのバッファーがバッファーローカルな値をもたない限り)が、それはカレントバッファーから参照される値ではありません。
;; バッファー‘foo’で行う:
(make-local-variable 'buffer-local)
⇒ buffer-local
(setq buffer-local 'value-in-foo)
⇒ value-in-foo
(setq-default buffer-local 'new-default)
⇒ new-default
buffer-local
⇒ value-in-foo
(default-value 'buffer-local)
⇒ new-default
;; (新しい)バッファー‘bar’で行う:
buffer-local
⇒ new-default
(default-value 'buffer-local)
⇒ new-default
(setq buffer-local 'another-default)
⇒ another-default
(default-value 'buffer-local)
⇒ another-default
;; バッファー‘foo’に戻って行う:
buffer-local
⇒ value-in-foo
(default-value 'buffer-local)
⇒ another-default
この関数はsetq-defaultと似ていますが、symbolは通常の引数として評価されます。
(set-default (car '(a b c)) 23)
⇒ 23
(default-value 'a)
⇒ 23
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ファイルにローカル変数の値を指定できます。そのファイルをvisitしているバッファー内で、これらの変数にたいしてバッファーローカルなバインディングを作成するために、Emacsはこれらを使用します。ファイルローカル変数の基本的な情報については、Local Variables in Files in The GNU Emacs Manualを参照してください。このセクションはファイルローカル変数が処理される方法に影響する関数と変数を説明します。
ファイルローカル変数が勝手に関数や、後で呼び出されるLisp式を指定できる場合、ファイルのvisitによりEmacsが乗っ取られてしまうかもしれません。Emacsは、指定された値が安全だと既知のファイルローカル変数だけを自動的にセットすることにより、この危険から保護します。これ以外のファイルローカル変数は、ユーザーが同意した場合のみセットされます。
追加の安全策として、Emacsがファイルローカル変数を読み込むとき、一時的にread-circleがnilにバインドされます(Input Functionsを参照してください)。これはLispリーダー循環および共有されたLisp構造(Read Syntax for Circular Objectsを参照してください)を認識することを防ぎます。
この変数はファイルローカル変数を処理するかどうかを制御します。以下の値が利用できます:
t(デフォルト)安全な変数をセットして、安全でない変数については問い合わせます(1回)。
:safe安全な変数だけをセットして、問い合わせはしません。
:all問い合わせをせずに、すべての変数をセットします。
nil変数をセットしません。
すべての変数にたいして問い合わせます(1回)。
これは正規表現のリストです。ファイルがこのリストの要素にマッチする名前をもつ場合、任意のファイルローカル変数のフォームはスキャンされません。どんなときにこれを使いたいかの例は、See section How Emacs Chooses a Major Modeを参照してください。
この関数は、カレントバッファーの内容により指定された任意のローカル変数として、必要に応じてバインドと評価を行います。変数enable-local-variablesは、ここでも効果をもちます。しかし、この関数は‘-*-’行の、‘mode:’ローカル変数を探しません。set-auto-modeはこれを行い、enable-local-variablesも考慮されます(How Emacs Chooses a Major Modeを参照してください)。
この関数は、file-local-variables-alist内に格納されたalistを調べて、各ローカル変数を順に適用することにより機能します。この関数は、変数に適用する前(または後)に、before-hack-local-variables-hook(またはhack-local-variables-hook)を呼び出します。alistが非nilの場合のみ、事前のフック(before-hook)を呼び出し、その他のフックは常に呼び出します。この関数は、そのバッファーがすでにもつメジャーモードと同じメジャーモードが指定された場合には、‘mode’要素を無視します。
オプションの引数mode-onlyが非nilの場合、この関数が行うのはメジャーモードを指定するシンボルをreturnするのがすべてで、‘-*-’行またはローカル変数リストがメジャーモードを指定していればそのモード、それ以外はnilをreturnします。この関数はモードや他のファイルローカル変数をセットしません。
このバッファーローカルな変数は、ファイルローカル変数のセッティングのalistを保持します。alistの各要素は(var . value)という形式で、varはローカル変数のシンボル、valueはその値です。Emacsがファイルをvisitするとき、最初にすべてのファイルローカル変数をこのalistに収集して、その後に変数1つずつに関数hack-local-variablesを適用します。
Emacsは、file-local-variables-alistに格納されたファイルローカル変数を適用する直前に、このフックを呼び出します。
Emacsは、file-local-variables-alistに格納されたファイルローカル変数を適用し終えた直後に、このフックを呼び出します。
ある変数にたいしてsafe-local-variableプロパティーにより、安全な値を指定できます。このプロパティーは引数を1つとる関数です。与えられた値にたいして、その関数が非nilをreturnした場合、その値は安全です。一般的に目にするファイル変数の多くは、safe-local-variableプロパティーをもちます。これらのファイル変数には、fill-column、fill-prefix、indent-tabs-modeが含まれます。ブーリーン値の変数にたいしては、プロパティーの値にbooleanpを使用します。
defcustomを使用してユーザーオプションを定義するとき、defcustomに引数:safe
functionを追加することにより、safe-local-variableプロパティーをセットできます(Defining Customization Variablesを参照してください)。
この変数は、ある変数の値が安全であることをマークする、別の方法を提供します。これはコンスセル(var
. val)のリストで、varは変数名、valはその変数にたいして安全な値です。
Emacsが一連のファイルローカル変数にしたがうかどうかユーザーに尋ねるとき、ユーザーはそれらの変数が安全だとマークすることができます。安全だとマークするとsafe-local-variable-valuesにこれらのvariable/valueペアーが追加され、ユーザーのカスタムファイルに保存します。
この関数は、上記の条件に基づき、symに値valを与えても安全な場合は、非nilをreturnします。
いくつかの変数は危険(risky)だと判断されます。ある変数が危険な場合、その変数が自動的にsafe-local-variable-valuesに追加されることはありません。ユーザーがsafe-local-variable-valuesを直接カスタマイズすることにより、明示的に値を許さない限り、危険な変数をセットする前にEmacsは常に確認を求めます。
名前が非nilのrisky-local-variableプロパティーをもつ任意の変数は、危険だと判断されます。defcustomを使用してユーザーオプションを定義するとき、defcustomに引数:risky
valueを追加することにより、ユーザーオプションにrisky-local-variableプロパティーをセットできます。それに加えて名前が‘-command’、‘-frame-alist’、‘-function’、‘-functions’、‘-hook’、‘-hooks’、‘-form’、‘-forms’、‘-map’、‘-map-alist’、‘-mode-alist’、‘-program’、‘-predicate’で終わる任意の変数は、自動的に危険だと判断されます。後に数字をともなう変数‘font-lock-keywords’および‘font-lock-keywords’、さらに‘font-lock-syntactic-keywords’も危険だと判断されます。
この関数は、symが上記の条件にもとづき危険な変数の場合は、非非nilをreturnします。
この変数はファイルによりローカル値を与えられるべきではない変数のリストを保持します。これらの変数に指定された任意の値は、完全に無視されます。
‘Eval:’“変数”も抜け道になる可能性があるので、Emacsは通常、それを処理する前に確認を求めます。
この変数は‘-*-’行中、またはvisitされるファイル内のローカル変数リストの、‘Eval:’にたいする処理を制御します。値tは、無条件に実行することを意味します。nilは、それらを無視することを意味します。それ以外は、各ファイルにたいして何を行うか、ユーザーに確認を求めることを意味します。デフォルト値は、maybeです。
この変数は、ファイルローカル変数リスト内の‘Eval:’“変数”の中、評価しても安全な式のリストを保持します。
その式が関数呼び出しで、その関数がsafe-local-eval-functionプロパティーをもつ場合、そのプロパティー値はその式の評価が安全かどうかを決定します。プロパティー値は、その式をテストするための述語(predicate)、そのような述語のリスト(成功した述語があれば安全)、またはt(引数が定数である限り常に安全)を指定できます。
テキストプロパティーは、それらの値に関数呼び出しを含めることができるので、抜け道になる可能性があります。したがって、Emacsはファイルローカル変数にたいして指定された文字列値から、テキストプロパティーを取り除きます。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ディレクトリーは、そのディレクトリー内のすべてのファイルに共通なローカル変数値を指定することができます。Emacsは、そのディレクトリー内の任意のファイルをvisitしているバッファー内で、それらの変数にたいするバッファーローカルなバインディングを作成するために、これを使用します。これは、そのディレクトリー内のファイルが何らかのプロジェクトに属していて、同じローカル変数を共有するときなどに有用です。
ディレクトリーローカル変数を指定するために、2つの異なる方法があります: 1つは特別なファイルにそれを記述する方法、もう1つはそのディレクトリーにプロジェクトクラス(project class)を定義する方法です。
この定数は、Emacsがディレクトリーローカル変数が見つけることができる期待する、ファイルの名前です。ファイル名は、.dir-locals.el8です。ディレクトリー内でその名前をもつファイルにより、Emacsはディレクトリー内の任意のファイル、または任意のサブディレクトリー(オプションでサブディレクトリーを除外できます。以下を参照してください)にセッティングを適用します。独自に.dir-locals.elをもつサブディレクトリーがある場合、Emacsはサブディレクトリーで見つかった1番深いファイルのディレクトリーからディレクトリーツリーを上方に移動しながら、1番深いファイルのセッティングを使用します。このファイルは、ローカル変数をフォーマットされたリストとして指定します。詳細は、Per-directory Local Variables in The GNU Emacs Manualを参照してください。
この関数は.dir-locals.elファイルを読み込み、そのディレクトリー内の任意のファイルをvisitしているバッファーにたいしてローカルなfile-local-variables-alist内に、それらを適用することなくディレクトリーローカル変数を格納します。この関数はディレクトリーローカルなセッティングもdir-locals-class-alist(.dir-locals.elファイルが見つかったディレクトリーにたいする特別なクラスを定義する)内に格納します。この関数は、以下で説明するように、dir-locals-set-class-variablesおよびdir-locals-set-directory-classを呼び出すことにより機能します。
この関数はディレクトリーローカル変数を探して、即座にそれらをカレントバッファーに適用します。これはDiredバッファーのような、非ファイルバッファーをディレクトリーローカル変数のセッティングにしたがわせるために、モードコマンド呼び出しの中から呼び出されることを意図したものです。非ファイルバッファーにたいしては、Emacsはdefault-directoryと、その親ディレクトリーの中から、ディレクトリーローカル変数を探します。
この関数は、classという名前がつけられたシンボルにたいして、一連の変数セッティングを定義します。その後このクラスを1つ以上のディレクトリーに割り当てることができ、するとEmacsはこれらの変数セッティングを、それらのディレクトリー内のすべてのファイルに適用します。variables内のリストは、2つの形式
— (major-mode . alist)または(directory
. list) —
のうち1つをもつことができます。1番目の形式では、そのファイルのバッファーがmajor-modeを継承するモードに切り替わるときに、連想リストalist内のすべての変数が適用されます。alistは、(name
.
value)という形式です。major-modeにたいする特別な値nilは、そのセッティングが任意のモードに適用できることを意味します。alist内では、特別なnameとして、subdirsを使用することができます。連想値がnilの場合、alistは関連するディレクトリー内のファイルだけに適用され、それらのサブディレクトリーには適用されません。
variablesの2番目の形式では、directoryがそのファイルのディレクトリーの最初のサブディレクトリーの場合、上記のルールにしたがって、listが再帰的に適用されます。listは、この関数のvariablesで指定できる2つの形式のうち、1つを指定します。
この関数はdirectoryおよびサブディレクトリー内のすべてのファイルにclassを割り当てます。その後、classにたいして指定されたすべての変数セッティングは、directoryおよびその子ディレクトリー内でvisitされた任意のファイルに適用されます。classは事前にdir-locals-set-class-variablesで定義されていなければなりません。
Emacsは、.dir-locals.elファイルからディレクトリー変数をロードするとき、内部的にこの関数を使用します。その場合、オプションの引数mtimeは、ファイルの修正日時(modification
time。file-attributesによりreturnされる)を保持します。Emacsは、記憶されたローカル変数がまだ有効化チェックするために、この日時を使用します。ファイルを通じ手ではなく直接クラスを割り当てる場合、この引数はnilになります。
このalistはクラスシンボル(class symbol)と連想変数セッティング(associated variable
settings)を保持します。これはdir-locals-set-class-variablesにより更新されます。
このalistはディレクトリー名、それらに割り当てられたクラス名、およびこのエントリーに関連するディレクトリーローカル変数ファイルの修正日時を保持します。関数dir-locals-set-directory-classは、このlistを更新します。
nilの場合、ディレクトリーローカル変数は無視されます。この変数は、ファイルローカル変数(File Local Variablesを参照してください)にしたがい、ディレクトリーローカル変数は無視したいモードにたいして有用かもしれません。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
シノニムとして2つの変数を作成するのが有用なときがあります。2つの変数は常に同じ値をもち、、どちらか一方を変更すると、もう一方も変更されます。変数の名前を変更
— 古い名前はよく考慮して選択されたものではなかった、あるいは変数の意味が部分的に変更された等の理由で —
するとき、互換性のために新しい名前のエイリアス(alias)として古い名前を維持するのが有用なときがあるかもしれません。defvaraliasにより、これを行うことができます。
この関数はシンボルbase-variableのエイリアスとして、シンボルnew-aliasを定義します。これはnew-aliasから値を取得すると、base-variableの値がreturnされ、new-aliasの値を変更すると、base-variableの値が変更されることを意味します。エイリアスされた2つの変数名は、常に同じ値と同じバインディングを共有します。
docstring引数が非nilの場合、それはnew-aliasのドキュメント文字列を指定します。それ以外では、エイリアスは(もしあれば)base-variableと同じドキュメント文字列となります。ただし、それはbase-variable自体がエイリアスではない場合で、エイリアスの場合、new-aliasはエイリアスチェーンの最後の変数のドキュメント文字列になります。
この関数はbase-variableをreturnします。
変数のエイリアスは、変数にたいする古い名前を新しい名前に置き換える、便利な方法です。make-obsolete-variableは古い名前を陳腐化(obsolete)していると宣言し。それが将来のある時点で削除されるかもしれないことを宣言します。
この関数は、倍とコンパイラーに変数obsolete-nameが陳腐化していると警告させます。current-nameがシンボルの場合、それはこの変数の新たな名前です。その後、obsolete-nameのかわりにcurrent-nameを使用するよう、警告メッセージを伝えます。current-nameが文字列の場合、これはメッセージで、置き換えられる変数はありません。whenは、その変数が最初に陳腐化するのがいつかを示す文字列です(通常はバージョン番号文字列)。
オプションの引数access-typeは、非nilの場合は陳腐化の警告を引き起こすアクセスの種類を指定します。getまたはsetを指定できます。
2つの変数シノニムを作成して、マクロdefine-obsolete-variable-aliasを使用することにより同時に1つが陳腐化していると宣言できます。
このマクロは変数obsolete-nameが陳腐化しているとマークして、それを変数current-nameにたいするエイリアスにします。これは以下と等価です:
(defvaralias obsolete-name current-name docstring) (make-obsolete-variable obsolete-name current-name when)
この関数は、variableのエイリアスチェーンの最後の変数をreturnします。variableがシンボルでない場合、またはvariableがエイリアスとして定義されていない場合、この関数はvariableをreturnします。
この関数は、シンボルのチェーンがループしているときは、cyclic-variable-indirectionエラーをシグナルします。
(defvaralias 'foo 'bar)
(indirect-variable 'foo)
⇒ bar
(indirect-variable 'bar)
⇒ bar
(setq bar 2)
bar
⇒ 2
foo
⇒ 2
(setq foo 0)
bar
⇒ 0
foo
⇒ 0
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
通常のLisp変数には、有効なLispオブジェクトである任意の値を割り当てることができます。しかし、LispではなくCで定義されたLisp変数もあります。これらの変数のほとんどは、DEFVAR_LISPを使用してCコードで定義されています。Lispで定義された変数と同様、これらは任意の値をとることができます。しかし、いくつかの変数はDEFVAR_INTやDEFVAR_BOOLを使用して定義されています。C実装の概要的な議論は、Writing Emacs
Primitives、特にタイプsyms_of_filenameの関数の説明を参照してください。
タイプがDEFVAR_BOOLの変数は、値にnilかtしかとることができません。他の値の割り当てを試みると、tはセットされます:
(let ((display-hourglass 5))
display-hourglass)
⇒ t
この変数は、タイプDEFVAR_BOOLのすべての変数のリストを保持します。
タイプがDEFVAR_INTの変数は、整数値だけをとることができます。他の値の割り当てを試みると、結果はエラーになります:
(setq undo-limit 1000.0) error→ Wrong type argument: integerp, 1000.0
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ジェネリック変数(generalized variable: 汎変数)またはplace formは、値が格納されるLispメモリー内の多くの場所のうちの1つです。1番シンプルなplace formは、通常のLisp変数です。しかし、リストのCARとCDR、配列の要素、シンボルのプロパティー、その他多くのロケーション(location)も、Lisp値が格納される場所です。
ジェネリック変数は、C言語の“lvalues(左辺値)”と類似しています。C言語のlvalueでは、‘x =
a[i]’で配列から要素を取得し、同じ表記を使用して、‘a[i] =
x’で要素を格納します。a[i]のような特定のフォームが、Cではlvalueになれるように、Lispでジェネリック変数になることができる一連のフォームが存在します。
11.15.1 The setf Macro | setfマクロ。
| |
11.15.2 Defining new setf forms | 新たなsetfフォームの定義。
|
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
setf Macrosetfマクロは、ジェネリック変数を操作する、もっとも基本的な方法です。setfフォームはsetqと似ていますが、シンボルだけでなく、左辺の任意のplace
formを受け入れます。たとえば(setf (car a)
b)はaのcarをbにセットして、(setcar a
b)と同じ操作を行いますが、すべてのplaceのタイプにセットおよびアクセスするために2つの別個の関数を覚える必要はありません。
このマクロはformを評価して、それをplaceに格納します。placeは有効なジェネリック変数フォームでなければなりません。複数のplace/formペアーがある場合、割り当てはsetqのときと同様です。setfは最後のformの値をreturnします。
以下のLispフォームはジェネリック変数として機能するので、setfのplace引数にすることができます:
(setf x y)は完全に(setq x
y)と等しく、厳密に言うとsetq自体はsetfが存在するので冗長です。これは純粋にスタイルと歴史的な理由によりますが、多くのプログラマーは依然として単純な変数へのセットにはsetqの方を好みます。マクロ(setf
x y)は、実際には(setq x
y)に展開されるので、コンパイルされたコードでこれを使用することにパフォーマンス的な不利はありません。
aref cddr symbol-function car elt symbol-plist caar get symbol-value cadr gethash cdr nth cdar nthcdr
default-value process-get frame-parameter process-sentinel terminal-parameter window-buffer keymap-parent window-display-table match-data window-dedicated-p overlay-get window-hscroll overlay-start window-parameter overlay-end window-point process-buffer window-start process-filter
どのように処理すれば良いか知られていないplaceフォームを渡した場合、setfはエラーをシグナルします。
nthcdrの場合、関数のリスト引数は、それ自体が有効なplaceフォームでなければならないことに注意してください。たとえば、(setf
(nthcdr 0 foo) 7)は、foo自体に7をセットするでしょう。
マクロpush(Modifying List Variablesを参照してください)、およびpop(Accessing Elements of Listsを参照してください)は、リストだけでなくジェネリック変数を操作できます。(pop
place)は、place内に格納されたリストの最初の要素を削除してreturnします。これは(prog1
(car place) (setf place (cdr
place)))と類似していますが、すべてのサブフォームを1度だけ評価します。(push x
place)は、place内に格納されたリストの1番前に、xを挿入します。これは(setf
place (cons x
place))と類似していますが、サブフォームの評価を除きます。nthcdr
placeへのpushおよびpopは、リスト内の任意の位置での挿入および削除に使用できることに注意してください。
cl-libライブラリーは、追加のsetf
placeを含む、ジェネリック変数ニタイスルサマザマナ拡張を定義します。Generalized Variables in Common
Lisp Extensionsを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
setf formsこのセクションでは、setfが操作できる新たなフォームを定義する方法を説明します。
このマクロは、単純なケースにたいしてsetfメソッドを簡単に定義することを可能にします。nameは、関数、マクロ、スペシャルフォームの名前です。nameが、それを更新するための対応するsetter関数をもつときは、このマクロを使用できます(たとえば(gv-define-simple-setter
car setcar))。
このマクロをフォーム以下の呼び出しを
(setf (name args…) value)
以下のように変換します。
(setter args… value)
setfのような呼び出しは、valueをreturnするようにドキュメントされます。これに問題はありません。たとえばcarとsetcarでは、setcarはそれがセットする値をreturnするからです。setter関数がvalueをreturnしない場合は、gv-define-simple-setterのfix-return引数に、非nil値を使用してください。これは以下のようなものに展開されます
(let ((temp value)) (setter args… temp) temp)
これで正しい結果がreturnされることが保証されます。
このマクロは、上述のフォームより複雑なsetf展開を可能にします。たとえば、呼び出すべきシンプルなsetter関数が存在しないときや、もしそれが存在してもplace
formとは異なる引数を要求する場合には、このフォームを使う必要があるかもしれません。
このマクロは最初にsetf引数フォーム(value
args…)をarglistにバインドして、その後bodyを実行することにより、フォーム(setf
(name args…)
value)を展開します。bodyは割り当てを行うLispフォームをreturnし、最後にセットされた値をreturnするべきです。以下はこのマクロの使用例です:
(gv-define-setter caar (val x) `(setcar (car ,x) ,val))
展開をさらに制御するには、マクロgv-define-expanderを参照してください。マクロgv-letplaceは、setfのように処理を行うマクロを定義するのに有用です。詳細は、gv.elのソースファイルを参照してください。
Common Lispに関する注意: Common Lispは関数の
setf、すなわち“setf関数”の挙動を指定するための別の方法を定義します。setf関数の名前はシンボルではなく。リスト(setf name)です。たとえば(defun (setf foo) …)は、setfがfooに適用されるときに使用される関数を定義します。Emacsはこれをサポートしません。適切な展開が定義されていないフォームにsetfを使用すると、コンパイル時にエラーとなります。Common Lispでは、関数(setf func)が後で定義されるので、エラーにはなりません。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lispプログラムは主にLisp関数で構成されます。このチャプターは、関数とは何か、引数を受け取る方法、関数を定義する方法を説明します。
| 12.1 What Is a Function? | Lisp関数 vs. プリミティブ; 専門用語。 | |
| 12.2 Lambda Expressions | 関数がLispオブジェクトとして表現される方法。 | |
| 12.3 Naming a Function | シンボルは関数を名づける役割を果たすことができる。 | |
| 12.4 Defining Functions | 関数定義のためのLisp式。 | |
| 12.5 Calling Functions | 既存の関数を使う方法。 | |
| 12.6 Mapping Functions | リストの各要素などに関数を適用する。 | |
| 12.7 Anonymous Functions | ラムダ式、それは無名の関数。 | |
| 12.8 Accessing Function Cell Contents | シンボルの関数定義へのアクセスとセット。 | |
| 12.9 Closures | レキシカル環境に囲まれた関数。 | |
| 12.10 Advising Emacs Lisp Functions | 関数の定義への追加。 | |
| 12.11 Declaring Functions Obsolete | 関数を陳腐と宣言する。 | |
| 12.12 Inline Functions | コンパイラーによりインライン展開される関数。 | |
12.13 The declare Form | 関数についての補足的な情報の追加。 | |
| 12.14 Telling the Compiler that a Function is Defined | 関数が定義されていることをコンパイラーに知らせる。 | |
| 12.15 Determining whether a Function is Safe to Call | 呼び出しても安全な関数なのか判断する。 | |
| 12.16 Other Topics Related to Functions | 関数が動作する方法において特別な意味をもつ、特定のLispプリミティブのクロスリファレンス。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
一般的な意味では、関数とは引数(arguments)と呼ばれる与えられた入力値の計算を担うルールです。計算の結果は、その関数の値(value)、またはreturn値(return value)と呼ばれます。計算は、変数の値やデータ構造の内容を変更する等の副作用をもつこともできます。
ほとんどのコンピューター言語では、関数はそれぞれ名前をもちます。しかしLispでは、厳密な意味において、関数は名前をもちません。関数はオブジェクトであり、関数の名前の役割を果たすシンボルに関連づけることができますが(たとえばcar)、それはオプションです。Naming a Functionを参照してください。関数が名前を与えられたとき、通常はそのシンボルを“関数”として参照します(たとえば、関数carのように参照します)。このマニュアルでは、関数名と関数オブジェクト自身との間の区別は、通常は重要ではありませんが、それが意味をもつような場合は注記します。
スペシャルフォーム(special form)、マクロ(macro)と呼ばれる、関数likeなオブジェクトがいくつかあり、それらも引数を受け受け、計算を担います。しかし以下で説明するように、Emacs Lispではこれらは関数とは考えられません。
以下は関数および関数likeなオブジェクトにたいする、重要な条件です:
Lispで記述された関数(厳密には関数オブジェクト)です。これらについては、以降のセクションで説明します。 Lambda Expressionsを参照してください。
Lispから呼び出すことができますが、実際にはCで記述されています。プリミティブは、ビルトイン関数(built-in
functions)や、サブルーチン(subr)といった呼ばれかたもします。それらの例には関数likeなcarやappendが含まれます。加えて、すべてのスペシャルフォーム(以下参照)もプリミティブと考えられます。
関数はLispの基礎となる部分(たとえばcar)であり、オペレーティングシステムのサービスにたいして値レベルのインターフェースを与え、高速に実行される必要があるため、通常はプリミティブとして実装されています。Lispで定義された関数とは異なり、プリミティブの修正や追加には、Cソースの変更とEmacsのリコンパイルが必要です。Writing Emacs Primitivesを参照してください。
プリミティブは関数と似ていますが、すべての引数が通常の方法で評価はされません。いくつかの引数だけが評価されるかもしれず、通常ではない順序で、複数回評価されるかもしれません。プリミティブの例には、if、and、whileが含まれます。Special Formsを参照してください。
あるLisp式を、オリジナルの式のかわりに評価される別の式に変換する、関数とは別のLispで定義された構造です。マクロは、スペシャルフォームが行う一連のことを、Lispプログラマーが行うのを可能にします。Macrosを参照してください。
command-executeプリミティブを通じて呼び出すことができるオブジェクトで、通常はそのコマンドにバインドされたキーシーケンスを、ユーザーがタイプすることにより呼び出されます。Interactive Callを参照してください。コマンドは通常、関数です。その関数がLispで記述されている場合は、関数の定義内のinteractiveフォームによりコマンドとなります(Defining Commandsを参照してください)。関数であるコマンドは、他の関数と同様、Lisp式から呼び出すこともできます。
キーボードマクロ(文字列およびベクター)は関数ではありませんが、これらもコマンドです。Keyboard Macrosを参照してください。シンボルの関数セルにコマンドが含まれている場合、わたしたちはそのシンボルをコマンドと言います(Symbol Componentsを参照してください)。そのような名前つきコマンド(named command)は、M-xで呼び出すことができます。
ラムダ式とよく似た関数オブジェクトですが、クロージャーはレキシカル変数バインディングの“環境”にも囲まれています。Closuresを参照してください。
バイトコンパイラーによりコンパイルされた関数です。Byte-Code Function Typeを参照してください。
実際の関数のプレースホルダーです。autoloadオブジェクトが呼び出された場合、Emacsは実際の関数の定義を含むファイルをロードした後、実際の関数を呼び出します。Autoloadを参照してください。
関数functionpを使用して、あるオブジェクトが関数かどうかテストできます:
この関数はobjectが任意の種類の関数(たとえばfuncallに渡すことができる)の場合は、tをreturnします。functionpは関数を名づけるシンボルにたいしてはt、スペシャルフォームにたいしてはnilをreturnすることに注意してください。
functionpとは異なり、以下の3つの関数は、シンボルをそれの関数定義としては扱いません。
この関数は、objectがビルトイン関数(たとえばLispプリミティブ)の場合は、tをreturnします。
(subrp 'message) ; messageはシンボルであり、
⇒ nil ; subrオブジェクトではない。
(subrp (symbol-function 'message))
⇒ t
この関数は、objectがバイトコード関数の場合は、tをreturnします。たとえば:
(byte-code-function-p (symbol-function 'next-line))
⇒ t
この関数はプリミティブsubrの引数リストについての情報を提供します。retrun値は、(min
.
max)というペアーです。minは引数の最小数です。maxは最大数、または引数&restを伴う関数にたいしてはシンボルmany、subrがスペシャルフォームの場合はシンボルunevalledです。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ラムダ式(lambda expression)は、Lispで記述された関数オブジェクトです。以下は例です:
(lambda (x) "Xの双曲線コサインをreturnする。" (* 0.5 (+ (exp x) (exp (- x)))))
Emacs Lispでは、このようなリストは、関数オブジェクトに評価される、有効な式です。
ラムダ式自身は名前をもたない、無名関数(anonymous function)です。ラムダ式をこの方法で使用できますが(Anonymous Functionsを参照してください)、名前付き関数(named functions)を作成するためにシンボルに関連付けられる方が一般的です(see section Naming a Function)。これらの詳細に触れる前に、以下のサブセクションではラムダ式の構成要素と、それらが行うことについて説明します。
| 12.2.1 Components of a Lambda Expression | ラムダ式のパーツ。 | |
| 12.2.2 A Simple Lambda Expression Example | シンプルな例。 | |
| 12.2.3 Other Features of Argument Lists | 引数リストの詳細と特別な機能。 | |
| 12.2.4 Documentation Strings of Functions | 関数内にドキュメントを記述する方法。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ラムダ式は、以下のようなリストです:
(lambda (arg-variables…) [documentation-string] [interactive-declaration] body-forms…)
ラムダ式の1番目の要素は常にシンボルlambdaです。これは、そのリストが関数を表すことを示します。lambdaで関数定義を開始する理由は、他の目的のたまえの使用が意図された他のリストが、意図せず関数として評価されないようにするためです。
2番目の要素は、シンボル — 引数変数名のリストです。これはラムダリスト(lambda list)と呼ばれます。Lisp関数が呼び出されたとき、引数値はラムダリスト内の変数と対応付けされます。ラムダリストは、与えられた値にたいするローカルバインディングが付与されます。Local Variablesを参照してください。
ドキュメント文字列(documentation string)はEmacs Lispのヘルプ機能にたいしてその、関数を説明する、関数定義に配されたLisp文字列オブジェクトです。Documentation Strings of Functionsを参照してください。
インタラクティブ宣言(interactive declaration)は、(interactive
code-string)という形式のリストです。これは、この関数が対話的に使用された場合に引数を提供する方法を宣言します。この宣言をもつ関数は、コマンド(command)と呼ばれます。コマンドはM-xを使用したり、キーにバインドして呼び出すことができます。この方法で呼び出されることを意図しない関数は、インタラクティブ宣言を持つべきではありません。インタラクティブ定義を記述する方法は、See section Defining Commandsを参照してください。
残りの要素は、その関数のbody(本体) — その関数が処理を行うためのLispコード(Lispプログラマーは“評価されるLispフォームのリスト”と言うでしょう)です。この関数からreturnされる値は、bodyの最後の要素によりreturnされる値です。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下の例を考えてみてください:
(lambda (a b c) (+ a b c))
以下のように、funcallに渡すことにより、この関数を呼び出すことができます:
(funcall (lambda (a b c) (+ a b c))
1 2 3)
この呼び出しは、変数aに1、bに2、cに3をバインドして、ラムダ式のbodyを評価します。bodyの評価により、これら3つの数が加算されて、6が結果として生成されます。したがってこの関数呼び出しにより、6がreturnされます。
以下のように、引数は他の関数の結果であってもよいことに注意してください:
(funcall (lambda (a b c) (+ a b c))
1 (* 2 3) (- 5 4))
これは引数1、(* 2 3)、(- 5
4)を左から右に評価します。その後、ラムダ式に引数1、6、1を適用して、値8が生成されます。
これらの例が示すように、ローカル変数を作成して、それらに値を与えるフォームとして、CARがラムダ式であるようなフォームを使用することができます。古い時代のLispでは、この方法がローカル変数をバインドして初期化する唯一の方法でした。しかし現在では、この目的にはフォームletを使用するほうが明解です(Local Variablesを参照してください)。ラムダ式は主に、他の関数の引数として渡される無名関数(Anonymous Functionsを参照してください)として、あるいは名前つき関数(Naming a Functionを参照してください)を生成するためにシンボルの関数定義に格納するために使用されます。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
シンプルなサンプル関数(lambda (a b c) (+ a b
c))は、3つの引数変数を指定しているので、3つの引数で呼び出されなければなりません。引数を2つしか指定しなかったり4つ指定した場合は、wrong-number-of-argumentsエラーとなります。
特定の引数を省略できる関数を記述できると便利なこともあります。たとえば関数substringは3つの引数 —
文字列、開始インデックス、終了インデックス —
を受け取りますが、3つ目の引数を省略した場合、デフォルトでその文字列のlengthとなります。関数listや+が行うように、特定の関数にたいして不定個の引数を指定できると便利なときもあります。
関数が呼び出されるとき省略されるかもしれないオプションの引数を指定するには、オプションの引数の前にキーワード&optionalを含めるだけです。0個以上の追加引数のリストを指定するには、最後の引数の前にキーワード&restを含めます。
したがって、引数リストの完全な構文は以下のようになります:
(required-vars… [&optional optional-vars…] [&rest rest-var])
角カッコ(square
bracket)は、&optionalと&rest、およびそれらに続く変数が省略できることを示します。
この関数の呼び出しには、required-varsのそれぞれにたいして、実際の引数が要求されます。0個以上のoptional-varsにたいして実際の引数があるかもしれませんが、ラムダ式が&restを使用していなければ、その個数を超えて実際の引数を記述することはできません。&restが記述されている場合、追加で任意個の実際の引数があるかもしれません。
optionaやrest変数にたいして実際の引数が省略された場合、それらのデフォルトは常にnilになります。関数にたいして引数に明示的にnilが使用されたのか、引数が省略されたのかを区別することはできません。しかし関数のbodyが、nilを他の有意な値が省略されたと判断することは自由です。これはsubstringが行っていることです。substringの3つ目の引数がnilの場合、それは文字列の長さを使用することを意味します。
Common Lispに関する注意: Common Lispでは、オプションの引数が省略されたときに使用するデフォルト値を指定できます。Emacs Lispは、引数が明示的に渡されたかを調べる、“supplied-p”変数はサポートしません。
例えば、引数リストは以下のようになります:
(a b &optional c d &rest e)
これはaとbは最初の2つの実引数となり、これらは必須です。さらに1つまたは2つの引数が指定された場合、それらは順番にcとdにバインドされます。1つ目から4つ目の引数の後の引数は、リストにまとめられて、eにそのリストがバインドされます。2つしか引数が指定されなかった場合、cはnilになります。2つまたは3つの引数の場合、dはnilです。引数が4つ以下の場合、eはnilになります。
オプションの引数の後ろに必須の引数を指定する方法はありません —
これは意味を成さないからです。なぜそうなるかは、この例でcがオプションでdが必須な場合を考えてみてください。実際に3つの引数が与えられたとします。3番めの引数は何を指定したのでしょうか?
この引数はcなのでしょうか、それともdに使用されるのでしょうか?
両方の場合が考えられます。同様に、&rest引数の後に、さらに引数(必須またはオプション)をもつことも意味を成しません。
以下に引数リストと、それを正しく呼び出す例をいくつか示します:
(funcall (lambda (n) (1+ n)) ; 1つの必須: 1) ; これは正確に1つの引数を要求する。 ⇒ 2 (funcall (lambda (n &optional n1) ; 1つは必須で、1つはオプション: (if n1 (+ n n1) (1+ n))) ; 1つまたは2つの引数。 1 2) ⇒ 3 (funcall (lambda (n &rest ns) ; 1つは必須で、後は残り: (+ n (apply '+ ns))) ; 1つ以上の引数。 1 2 3 4 5) ⇒ 15
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ラムダ式は、ラムダリストの食後に、オプションでドキュメント文字列(documentation string)をもつことができます。この文字列は、その関数の実行に影響を与えません。これはコメントの一種ですが、Lisp機構に内在するシステム化されたコメントであり。Emacsのヘルプ機能で使用できます。ドキュメント文字列にアクセスする方法は、Documentationを参照してください。
たとえその関数があなたのプログラム内だけで呼び出される関数だとしても、すべての関数にドキュメント文字列を与えるのはよいアイデアです。ドキュメント文字列はコメントと似ていますが、コメントより簡単にアクセスできます。
ドキュメント文字列の1行目は、関数自体にもとづくものであるべきです。なぜならaproposは、最初の1行目だけを表示するからです。ドキュメント文字列の1行目は、その関数の目的を要約する、1つまたは2つの完全なセンテンスで構成されるべきです。
ドキュメント文字列の開始は通常、ソースファイル内ではインデントされていますが、ドキュメント文字列の開始のダブルクォート文字の前にインデントのスペースがあるので、インデントはドキュメント文字列の一部にはなりません。ドキュメント文字列の残りの行がプログラムソース内で揃うようにインデントする人がいます。これは、間違いです。後続の行のインデントは文字列の内部にあります。これはソースコード内での見栄えはよくなりますが、ヘルプコマンドで表示したとき見栄えが悪くなります。
ドキュメント文字列がなぜオプションになるのか不思議に思うかもしれません。なぜなら、ドキュメント文字列の後には必須となる関数の構成要素であるbodyが続くからです。文字列を評価するとその文字列自身がれつrnされるので、それがbody内の最後のフォームでない限りなんの効果もありません。したがって、実際はbodyの1行目とドキュメント文字列で混乱が生じることはありません。bodyの唯一のフォームが文字列の場合、それはreturn値とドキュメントの両方の役目を果たします。
ドキュメント文字列の最後の行には、実際の関数引数とは異なる呼び出し規約を指定できます。これは以下のようなテキストを記述します
\(fn arglist)
ただし、このテキストの前に空行があり、テキスト自身が行頭から記述されていて、ドキュメント文字列内でこのテキストの後に改行が続かない場合です(‘\’はEmacsの移動コマンドが混乱するのを避けるために使用されます)。この方法で指定された呼び出し規約は、ヘルプメッセージ内で関数の実引数から生成される呼び出し例と同じ場所に表示されます。
マクロ定義内に記述された引数は、ユーザーがマクロ呼び出しの一部だと考える方法と合致しない場合がしばしばあるので、この機能はマクロ定義で特に有用です。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
シンボルは関数の名前となることができます。これは、そのシンボルの関数セル(function cell: Symbol Componentsを参照してください)が、関数オブジェクト(たとえばラムダ式)を含むときに起こります。するとそのシンボル自身が呼び出し可能な有効な関数、つまりそのシンボルの関数セルの関数と等価になります。
関数セルの内容は、そのシンボルの関数定義(function definition)と呼ぶこともできます。そのシンボルのかわりに、シンボルの関数定義を使う手続きのことをシンボル関数インダイレクション(symbol function indirection)と呼びます。Symbol Function Indirectionを参照してください。与えられたシンボルに関数定義がない場合、シンボルの関数セルはvoidと呼ばれ、それを関数として使用することはできません。
実際のところ、ほとんどすべての関数は名前をもち、その名前により参照されます。ラムダ式を定義することにより名前つきのLisp関数を作成、それを関数セル(Accessing Function Cell Contentsを参照してください)に置くことができます。しかし、さらに一般的なのはdefunスペシャルフォーム(次のセクションで説明します)を使う方法です。
Defining Functionsを参照してください。
わたしたちは関数名を与えるのは、Lisp式内で関数を名前で参照するのが便利だからです。また、名前つきの関数は簡単に自分自身を —再帰的(recursive)に参照することができます。さらに、プリミティブはテキスト的な名前だけで参照することができます。なぜならプリミティブ関数は入力構文(read syntax)をもたないオブジェクトだからです(Primitive Function Typeを参照してください)。
関数は一意な名前をもつ必要はありません。与えられた関数オブジェクトは、通常は1つのシンボルの関数セルだけに存在しますが、これは単に慣習的なものです。fsetを使用して、関数を複数のシンボルに格納するのは簡単です。それらのシンボルはそれぞれ、同じ関数にたいする有効な名前となります。
関数として使用されているシンボルを、変数としても利用できることに注意してください。シンボルのこれら2つの利用法は独立しており、競合はしません(これはSchemaのような他のいくつかのLisp方言には当てはまりません)。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
わたしたちは通常、関数を最初に作成したときに名前を与えます。これは関数の定義(defining a
function)と呼ばれ、defunマクロにより行われます。
defunは新たなLisp関数を定義する通常の方法です。これは、引数リストargs、およびbodyにより与えられるbodyフォームとともに、シンボルnameを関数として定義します。nameとargsを、クォートする必要はありません。
docが与えられた場合、それはその関数のドキュメント文字列を指定する文字列であるべきです(Documentation Strings of Functionsを参照してください)。declareが与えられた場合、それは関数のメタデータを指定する、declareフォームであるべきです(The declare Formを参照してください)。interactiveが与えられた場合、それは関数が対話的に呼び出される方法を指定するinteractiveフォームであるべきです(Interactive Callを参照してください)。
defunのreturn値は定義されていません。
以下にいくつか例を示します:
(defun foo () 5)
(foo)
⇒ 5
(defun bar (a &optional b &rest c)
(list a b c))
(bar 1 2 3 4 5)
⇒ (1 2 (3 4 5))
(bar 1)
⇒ (1 nil nil)
(bar) error→ Wrong number of arguments.
(defun capitalize-backwards () "Upcase the last letter of the word at point." (interactive) (backward-word 1) (forward-word 1) (backward-char 1) (capitalize-word 1))
意図せず既存の関数を再定義しないように、注意してください。defunはcarのようなプリミティブ関数でさえ、躊躇なく問い合わせもなしに再定義します。Emacsががががこれを妨げることはありません。なぜなら関数の再定義は故意に行われることがあり、そのような意図した再定義を、意図しない再定義と見分ける方法はないからです。
この関数は、定義definition(任意の有効なLisp関数)とともに、シンボルnameを関数として定義します。この関数のreturn値は未定義です。
docが非nilの場合、それは関数nameのドキュメントになります。それ以外は、definitionにより提供されるドキュメントが使用されます。
内部的には、defaliasは通常、定義のセットにfsetを使用します。しかしnameがdefalias-fset-functionプロパティーをもつ場合、fsetを呼び出すかわりに、それに割り当てられた値が使用されます。
defaliasを使う正しい場所は、特定の関数名がまさに定義される場所 —
特にソースファイルがロードされるとき明示的にその名前が出現する場所です。これはdefaliasが、defunと同じように、どれが関数を定義するファイルなのか記録するからです(Unloadingを参照してください)。
それとは対象的に、他の目的のために関数を操作するプログラムでは、そのような記録を保持しないfsetを使用するほうがよいでしょう。Accessing Function Cell Contentsを参照してください。
defunやdefaliasで新たなプリミティブ関数を作成することはできませんが、任意の関数定義を変更するのに使用することができ、通常の定義がプリミティブであるcarやx-popup-menuのような関数でさえ変更することができます。しかし、これは危険なことです。たとえば、Lispの完全性を損なうことなく、carを再定義するのはほとんど不可能だからです。それほど有名ではないx-popup-menuのような関数の再定義では、危険は減るものの、それでも期待したとおりに機能しないかもしれません。Cコードにこのプリミティブの呼び出しがある場合、それは直接そのプリミティブのC定義を呼び出すので、シンボル定義を変更しても、それらに影響はありません。
defsubstも参照してください。これはdefunのように関数を定義して、それのインライン展開を処理するようLispコンパイラーに指示します。Inline Functionsを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
関数を定義しただけでは、半分しか終わっていません。関数はそれを呼び出す(call) — たとえば実行(run)するまでは、何も行いません。関数のcallは、invocationとしても知られています。
関数を呼び出すもっとも一般的な方法は、リストの評価による方法です。たとえば、リスト(concat "a"
"b")を評価することにより、関数concatが引数"a"と"b"で呼び出されます。評価については、Evaluationを参照してください。
プログラム内で式としてリストを記述するときは、プログラム内にテキストで、どの関数を呼び出すか、いくつの引数を与えるかを指定します。通常は、これが行いたいことです。どの関数を呼び出すかを、実行時に計算する必要がある場合もあります。これを行うには、関数funcallを使用します。実行時にいくつの引数を渡すか決定する必要があるときは、applyを使用します。
funcallは、関数functionを引数argumentsで呼び出し、functionがreturnした値をreturnします。
funcallは関数なので、functionを含むすべての引数は、funcallの呼び出し前に評価されます。これは、呼び出される関数を得るための任意の式を使用できることを意味します。これはまた、funcallがargumentsに記述した式ではなく、その値だけを見ることを意味します。これらの値はfunction呼び出し中では、2回目は評価されません。funcallの処理は、関数の通常の呼び出し手続きと似ており、すでに評価された引数は評価されません。
引数functionは、Lisp関数、またはプリミティブ関数でなければなりません。つまりスペシャルフォームやマクロは、“評価されていない”引数式を与えられたときだけ意味があるので、指定することはできません。上述したように、funcallは最初に指定された評価前の引数を提供することはできません。
(setq f 'list)
⇒ list
(funcall f 'x 'y 'z)
⇒ (x y z)
(funcall f 'x 'y '(z))
⇒ (x y (z))
(funcall 'and t nil) error→ Invalid function: #<subr and>
これらの例を、applyの例と比較してみてください。
applyは、関数functionを引数argumentsで呼び出します。これはfuncallと同様ですが、1つ違いがあります。argumentsの最後はオブジェクトのリストです。これは1つのリストではなく、個別の引数としてfunctionに渡されます。わたしたちはこれを、applyがこのリストを展開(spread)(個々の要素が引数となるので)する、と言います。
applyは、functionを呼び出した結果をreturnします。funcallと同様、functionはLisp関数かプリミティブ関数でなければなりません。つまりスペシャルフォームやマクロは、applyでは意味をもちません。
(setq f 'list)
⇒ list
(apply f 'x 'y 'z) error→ Wrong type argument: listp, z
(apply '+ 1 2 '(3 4))
⇒ 10
(apply '+ '(1 2 3 4))
⇒ 10
(apply 'append '((a b c) nil (x y z) nil))
⇒ (a b c x y z)
applyを使用した興味深い例は、Definition of mapcarを参照してください。
ある関数にたいして、その関数のある引数を特定の値に固定し、他の引数は実際に呼びだされたときの値にできれば便利なことがあります。関数のいくつかの引数を固定することは、その関数の部分適用(partial application)と呼ばれます9。結果は、残りの引数をとる新たな関数で、すべての引数を合わせて元の関数を呼び出します。
Emacs Lispで部分適用を行う方法を示します:
この関数は、新たな関数をreturnします。この新しい関数は、呼びだされたときにargsと、呼び出し時に指定された追加の引数から成る引数リストでfuncを呼び出す関数です。funcにn個の引数を指定できる場合、m < n個の引数でapply-partiallyを呼び出すと、n - m個の新たな関数を生成します。
以下は、apply-partiallyと他のビルトイン関数+,を使用して、(もし存在しないなら)ビルトイン関数1+を定義する例です:
(defalias '1+ (apply-partially '+ 1) "Increment argument by one.")
(1+ 10)
⇒ 11
引数として関数をとったり、データ構造(特にフック変数やプロパティーリスト)から関数を探す関数はLispでは一般的で、それらはfuncallやapplyを使用してそれらの関数を呼び出します。引数として関数をとる関数は、ファンクショナル(functional)と呼ばれるときもあります。
ファンクショナルを呼び出すとき、引数としてno-op関数(何も行わない関数)を指定できると便利なときがあります。以下に2つの異なるno-op関数を示します:
この関数はargをreturnします。副作用はありません。
この関数は任意の引数を無視して、nilをreturnします。
いくつかの関数はユーザーに可視なコマンドで、これらは(通常はキーシーケンスを介して)対話的に呼び出すことができます。そのようなコマンドは、call-interactively関数を使用することにより、対話的に呼びだされたときと同様に呼び出すことができます。Interactive Callを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マップ関数(mapping
function)は与えられた関数(スペシャルフォームやマクロではない)を、リストや他のコレクションの各要素に適用します。Emacs
Lispにはそのような関数がいくつかあります。このセクションでは、リストにたいしてマッピングを行うmapcar、mapc、mapconcatを説明します。obarray内のシンボルにたいしてマッピングを行う関数mapatomsは、Definition of mapatomsを参照してください。ハッシュテーブル内のkey/value関係にたいしてマッピングを行う関数maphashは、Definition of maphashを参照してください。
これらのマップ関数は、文字テーブル(char-table)には適用されません。なぜなら文字テーブルは非常に広い範囲の疎な配列だからです。疎な配列であるという性質に適う方法で文字いテーブルにマッピングするには、関数map-char-tableを使用します(Char-Tablesを参照してください)。
mapcarは、関数functionをsequenceの各要素にたいして順番に適用し、その結果をリストでreturnします。
引数sequenceには、文字テーブルを除く任意の種類のシーケンス — つまりリスト、ベクター、ブールベクター、文字列を指定できます。結果は常にリストになります。結果の長さは、sequenceの長さと同じです。たとえば:
(mapcar 'car '((a b) (c d) (e f)))
⇒ (a c e)
(mapcar '1+ [1 2 3])
⇒ (2 3 4)
(mapcar 'string "abc")
⇒ ("a" "b" "c")
;; my-hooks内の各関数を呼び出す。
(mapcar 'funcall my-hooks)
(defun mapcar* (function &rest args) "Apply FUNCTION to successive cars of all ARGS. Return the list of results." ;; リストが消費されていなければ、 (if (not (memq nil args)) ;; CARに関数を適用する。 (cons (apply function (mapcar 'car args)) (apply 'mapcar* function ;; 残りの要素のための再帰。 (mapcar 'cdr args)))))
(mapcar* 'cons '(a b c) '(1 2 3 4))
⇒ ((a . 1) (b . 2) (c . 3))
mapcはmapcarと似ていますが、functionは副作用のためだけに使用されます —
つまりfunctionがreturnする値は無視され、リストに収集されません。mapcは常にsequenceをreturnします。
mapconcatは関数functionをsequenceの各要素に適用します。結果は結合された文字列になります。結果文字列の間に、mapconcatは文字列separatorを挿入します。separatorには通常、スペースやカンマ、あるいはその他の適切な区切り文字が含まれます。
引数functionはははは、1つの引数を取り文字列をreturnする関数でなければなりません。引数sequenceには、文字テーブルを除く、任意の種類のシーケンス — つまりリスト、ベクター、ブールベクター、文字列を指定できます。
(mapconcat 'symbol-name
'(The cat in the hat)
" ")
⇒ "The cat in the hat"
(mapconcat (function (lambda (x) (format "%c" (1+ x))))
"HAL-8000"
"")
⇒ "IBM.9111"
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
関数は通常、defunにより定義され、同時に名前が与えられますが、明示的にラムダ式を使う — 無名関数(anonymous
function)のほうが便利なときもあります。無名関数は、名前つき関数が有効な場所なら、どこでも有効です。無名関数は変数や関数の引数に割り当てられることがよくあります。たとえば、ある関数をリストの各要素に適用するmapcarのfunction引数に渡すかもしれません(Mapping Functionsを参照してください)。現実的な例は、describe-symbols exampleを参照してください。
無名関数として使用するためのラムダ式を定義するとき、原則的にはリストを構築する任意の手法を使用できます。しかし通常は、マクロlambda、スペシャルフォームfunction、または入力構文#'を使用するべきです。
このマクロは引数リストargs、(もしあれば)ドキュメント文字列doc、(もしあれば)インタラクティブ指定interactive、およびbodyで与えられるbodyフォームをもつ無名関数をreturnします。
実際にはこのマクロはlambdaフォームを“自己クォート(self-quoting)”します。つまりCARがlambdaであるようなフォームは、そのフォーム自身を得ます。
(lambda (x) (* x x))
⇒ (lambda (x) (* x x))
lambdaフォームは別に、1つの効果をもちます。このマクロは、function(以下参照)をサブルーチンとして使用することにより、Emacs評価機能(Emacs
evaluator)とバイトコンパイラーに、その引数が関数であることを告げます。
このスペシャルフォームは、評価を行わずに、function-objectをreturnします。この点では、quote(Quotingを参照してください)と似ています。しかしquoteとは異なり、Emacs評価機能とバイトコンパイラーに、これを関数として使用する意図を告げる役割をもちます。function-objectが有効なラムダ式と仮定すると、これは2つの効果をもちます:
入力構文#'は、functionの使用の略記です。以下のフォームは等価です:
(lambda (x) (* x x)) (function (lambda (x) (* x x))) #'(lambda (x) (* x x))
以下の例では、3つ目の引数に関数をとる、change-property関数を定義し、その後のchange-propertyで、無名関数を渡してこれを使用しています:
(defun change-property (symbol prop function)
(let ((value (get symbol prop)))
(put symbol prop (funcall function value))))
(defun double-property (symbol prop) (change-property symbol prop (lambda (x) (* 2 x))))
lambdaフォームをクォートしていないことに注意してください。
上記のコードをコンパイルした場合は、無名関数もコンパイルされます。リストをクォートすることにより無名関数を構築した場合、コンパイルはされません。
(defun double-property (symbol prop) (change-property symbol prop '(lambda (x) (* 2 x))))
この場合、無名関数はコンパイルされたコード内のラムダ式に保持されます。バイトコンパイラーは、change-propertyが関数としての使用を意図していることを知ることができないので、たとえこの関数が関数のように見えるとしても、このリストが関数であると決め込むことはできません。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
あるシンボルの関数定義(function definition)とは、そのシンボルの関数セルに格納されたオブジェクトのことです。ここでは、シンボルの関数セルにアクセス、テスト、セットする関数を説明します。
Definition of indirect-functionの、関数indirect-functionも参照してください。
これはsymbolの関数セル内のオブジェクトをreturnします。これは、returnされたオブジェクトが本物のの関数であるかチェックしません。
関数セルがvoidの場合、return値はnilです。関数セルがvoidのときと、nilがセットされているときを区別するには、fboundp(以下参照)を使用します。
(defun bar (n) (+ n 2))
(symbol-function 'bar)
⇒ (lambda (n) (+ n 2))
(fset 'baz 'bar)
⇒ bar
(symbol-function 'baz)
⇒ bar
シンボルに何の関数定義も与えていない場合、そのシンボルの関数セルはvoidだと言います。別の言い方をすると、その関数セルは、どんなLispオブジェクトも保持しません。そのシンボルを関数として呼びだそうとすると、Emacsはvoid-functionエラーをシグナルします。
voidは、nilやシンボルvoidとは異なることに注意してください。シンボルnilおよびvoidはLispオブジェクトであり、他のオブジェクトと同様、関数セルに格納することができます(これらのシンボルはdefunを使用して有効な関数に成ることができます)。voidである関数セルは、どのようなオブジェクトも含みません。
fboundpを使用して、任意のシンボルの関数定義がvoidかどうかテストすることができます。シンボルに関数定義を与えた後は、fmakunboundをつかえば、再びvoidにすることができます。
この関数は、そのシンボルが関数セルにオブジェクトをもっていればt、それ以外はnilをreturnします。これは、そのオブジェクトが本物の関数であるかチェックしません。
この関数はsymbolの関数セルをvoidにします。そのため、これ以降に関数セルにアクセスしようと試みると、void-functionエラーが発生します。これはsymbolをreturnします(When a Variable is “Void”のmakunboundも参照してください)。
(defun foo (x) x)
(foo 1)
⇒1
(fmakunbound 'foo)
⇒ foo
(foo 1) error→ Symbol's function definition is void: foo
この関数はsymbolの関数セルに、definitionを格納します。結果はdefinitionです。definitionは通常、関数または関数の名前であるべきですが、これはチェックされません。引数symbolは、通常のどおり評価される引数です。
この関数は主に、関数を定義したり変更すして構成を行う、defunやadvice-addのようなものからサブルーチンとして使用されます。シンボルにたいして、たとえばキーボードマクロ(Keyboard Macrosを参照してください)のような、関数ではない関数定義与えるためにも使用することができます:
;; 名前つきのキーボードマクロを定義する。
(fset 'kill-two-lines "\^u2\^k")
⇒ "\^u2\^k"
関数にたいして別の名前を作成するためにfsetを使いたい場合は、かわりにdefaliasの使用を考慮してください。Definition of defaliasを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Scoping Rules for Variable Bindingsで説明したように、Emacsはオプションで変数のレキシカルバインディングを有効にできます。レキシカルバインディングが有効な場合、あなたが(たとえばdefunなどで)作成した任意の名前つき関数、同様にlambdaマクロ、functionスペシャルフォーム、#'構文を使用して作成した任意の無名関数(Anonymous Functionsを参照してください)は、自動的にクロージャー(closure)に変換されます。
クロージャーとは、その関数が定ぎされたどときに存在したレキシカル環境の記録もあわせもつ関数です。クロージャーが呼び出されたとき、定義内のレキシカル変数の参照には、その保持されたレキシカル環境を使用されます。他のすべての点では、クロージャーは通常の関数と同様に振る舞います。特に、クロージャーは通常の関数と同じ方法で呼び出すことができます。
クロージャー使用する例は、Lexical Bindingを参照してください。
現在のところ、Emacs
Lispのクロージャーオブジェクトは、1つ目の要素にシンボルclosureをもつリストとして表現されます。そのリストは2つ目の要素としてレキシカル環境を表し、残りの要素で引数リストとbodyフォームを表します:
;; レキシカルバインディングが有効。
(lambda (x) (* x x))
⇒ (closure (t) (x) (* x x))
しかし実際には、クロージャーの内部構造は、内部的な実装の詳細と判断される残りのLisp界を“晒け出す”ものだと言えます。この理由により、クロージャーオブジェクトの構造を直接調べたり変更することは推奨しません。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
他のライブラリーの関数定義を変更する必要があるとき、またはfoo-functionoのようなフックやプロセスフィルター(process
filter)、または関数を値としてもつ任意の変数またはオブジェクトを変更する必要があるときには、名前つきの関数にはfsetかdefun、フック変数にはsetq、プロセスフィルターにはset-process-filterのように、適切なセッター関数(setter
function)を使用することができます。しかし、これらが以前の値を完全に破棄してしまうのが好ましくない場合もあります。
アドバイス(advice)機能により、関数にアドバイスすることにより、既存の関数定義に機能を追加できます。これは関数全体を再定義するより明解な手法です。
Emacsのアドバイスシステムは2つのプリミティブセットを提供します。コアとなるセットは、変数やオブジェクトのフィールドに保持された関数値にたいするものです(対応するプリミティブはadd-functionとremove-functionです)。もう1つのセットは、名前つき関数の最上位のレイヤーとなるものです(主要なプリミティブはadvice-addとadvice-removeです)。
たとえば、プロセスprocのプロセスフィルターの呼び出しをトレースするためには、以下を使用できます:
(defun my-tracing-function (proc string) (message "Proc %S received %S" proc string)) (add-function :before (process-filter proc) #'my-tracing-function)
これにより、そのプロセスの出力は、元のプロセスフィルターに渡される前に、my-tracing-functionに渡されるようになります。my-tracing-functionは元の関数と同じ引数を受け取ります。これを行った場合、以下のようにしてトレースを行わない振る舞いにリバートすることができます。
(remove-function (process-filter proc) #'my-tracing-function)
同様に、display-bufferという名前つきの関数の実行をトレースしたい場合は、以下を使用できます:
(defun his-tracing-function (orig-fun &rest args)
(message "display-buffer called with args %S" args)
(let ((res (apply orig-fun args)))
(message "display-buffer returned %S" res)
res))
(advice-add 'display-buffer :around #'his-tracing-function)
ここで、his-tracing-functionは元の関数のかわりに呼び出され、元の関数(加えてその関数の引数)を引数として受け取るので、必要な場合はそれを呼び出すことができます。出力を確認し終えたら、以下のようにしてトレースしない振る舞いにリバートできます:
(advice-remove 'display-buffer #'his-tracing-function)
上記の例で使用されている引数:beforeと:aroundは、2つの関数が構成される方法を指定します(これを行うには多くの方法があるからです)。追加された関数も、アドバイス(advice)と呼ばれます。
| 12.10.1 Primitives to manipulate advices | アドバイスを扱うプリミティブ。 | |
| 12.10.2 Advising Named Functions | 名前つき関数のアドバイス。 | |
| 12.10.3 Ways to compose advices | アドバイスを構成する方法。 | |
| 12.10.4 Adapting code using the old defadvice | 古いdefadviceを使用したコードの改良。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このマクロはplace(Generalized Variablesを参照してください)に格納された関数に、アドバイスfunctionを追加する手軽な方法です。
whereは、既存の関数のどこに — たとえば元の関数の前、または後に — functionが構成されるかを決定します。2つの関数を構成するために利用可能な方法のリストは、Ways to compose advicesを参照してください。
(通常は名前が-functionで終わる)変数を変更するときには、functionがグローバルに使用されるか、あるいはカレントバッファーだけに使用されるか選ぶことができます。placeが単にシンボルの場合、functionはplaceのグローバル値に追加されます。placeが(local
symbol)というフォームの場合、symbolはその変数の名前をreturnする式なので、functionはカレントバッファーだけに追加されます。最後に、レキシカル変数を変更したい場合には、(var
variable)を使用する必要があるでしょう。
add-functionで追加されたすべての関数は、自動的にプロパティーpropsの関連リストに加えることができます。現在のところ、特別な意味をもつのは2つのプロパティーだけです:
nameこれはアドバイスの名前を与えます。この名前は、remove-functionが取り除く関数を識別するのに使用できます。これは通常、functionが無名関数のときに使用されます。
depthこれは複数のアドバイスが与えられたときに、どのようにアドバイスを順番づけるかを指定します。depthのデフォルト0です。depthが100のとき、このアドバイスは可能な限りの深さを保持すべきことを意味し、-100のときは最外のアドバイスに留めることを意味します。同じdepthで2つのアドバイスが指定された場合、もっとも最近に追加されたアドバイスが最外になります。
:beforeアドバイスにたいしては、最外(outermost)になるということは、このアドバイスが他のアドバイスの前、つまり1番目に実行されることを意味し、最内(innermost)とは元の関数が実行される直前、すなわちこのアドバイスと元の関数の間に実行されるアドバイスは存在しないことを意味します。同様に:afterアドバイスにたいしては、最内とは元の関数の直後、つまりこの元の関数とアドバイスの間に実行される他のアドバイスは存在せず、最外とは他のすべてのアドバイスが実行された後にこのアドバイスが実行されることを意味します。:overrideの最内アドバイスは、元の関数だけをオーバーライドし、他のアドバイスは適用されませんが、:overrideの最外アドバイスは元の関数だけではなく。その他すべての適用済みのアドバイスををオーバーライドします。
functionがインタラクティブでない場合、欠オグされた関数は、(もしあれば)元の関数のインタラクティブ指定(interactive
spec)を継承します。それ以外は、結合された関数はインタラクティブになり、functionのインタラクティブ指定を使用します。1つ例外があります。functionのインタラクティブ指定が、(式や文字列ではない)関数の場合、元の関数のインタラクティブ指定を唯一の引数として、その関数を呼び出して、それが結合された関数のインタラクティブ指定になります。引数として受け取ったインタラクティブ指定を解釈するためには、advice-eval-interactive-specを使用します。
注意:
functionのインタラクティブ指定は結合された関数に適用され、functionではなく、結合された関数の呼び出し規約に従うべきです。多くの場合、これらは等しいので差異は生じませんが、functionの:around、:filter-args、filter-returnでは、重要になります。
このマクロはplaceに格納された関数から、functionを取り除きます。これは、add-functionを使用して、functionがplaceに追加されたときだけ機能します。
functionは、placeに追加された関数にたいして、ラムダ式にたいしても機能するように、equalを使用して比較を試みます。これは追加でplaceに追加された関数のnameプロパティーも比較します。これはequalを使用してラムダ式を比較するより信頼性があります。
adviceがすでにfunction-def内にある場合は、非nilをreturnします。上記のremove-functionと同様、実際の関数adviceのかわりに、アドバイス断片(piece
of advice)のnameも使用できます。
function-defに追加されたすべてのアドバイスに対して、関数fを呼び出します。fは2つの引数 — アドバイス関数と、それのプロパティーで呼びだされます。
そのような指定で関数がインタラクティブに呼び出されたように、インタラクティブ指定specを評価して、構築された引数のリストに対応するリストをreturnします。たとえば、(advice-eval-interactive-spec
"r\nP")は、リージョンの境界、カレントプレフィクス引数を含む、3つの要素からなるリストをreturnします。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
アドバイスの一般的な使い方は、名前つき関数やマクロにたいして使用する方法です。これは単にadd-functionを使用して以下のように行うことができます:
(add-function :around (symbol-function 'fun) #'his-tracing-function)
しかし、かわりにadvice-addとadvice-removeを使うべきです。この別の関数セットは名前つき関数に適用されるアドバイス断片を操作するためのもので、add-functionと比較して以下の追加機能があります。まず、これらはマクロおよびオートロードされた関数を扱う方法を知っています。次に、describe-functionにたいして、追加されたアドバイスと同様に、元のドキュメント文字列を維持します。さらに、関数が定義される前でも、アドバイスの追加と削除ができます。
既存の関数を関数全体を再定義せずに、既存の呼び出しを変更するために、advice-addは有用になります。しかし、その関数の既存の呼び出し元は、古い振る舞いを前提としているかもしれず、アドバイスによりその振る舞いが変更されたときに正しく機能しないかもしれないので、これはソースのバグにもなり得ます。アドバイスはデバッグを難しくする可能性もあります。デバッグを行う人は、その関数がアドバイスにより変更されたことに気づかなかったり、失念しているかもしれません。
これらの理由により、他の方法で関数の振る舞いを変更できない場合のために、アドバイスの使用は控えるべきです。フックを通じて同じことが行えるなら、フック(Hooksを参照してください)の使用が望ましい方法です。特定のキーが行う何かを変更したいだけなら、新しいコマンドを記述して、古いコマンドのキーバインドを新しいコマンドに再マップ(Remapping Commandsを参照してください)するのが、おそらくより良い方法です。特に、Emacs自身のソースファイルは、Emacs内の関数をアドバイスするべきではありません(現在のところこの慣習には数少ない例外がありますが、わたしたちはこれを改善しようと思っています)。
スペシャルフォーム(Special Formsを参照してください)はアドバイスできませんが、マクロは関数と同じ方法でアドバイスできます。もちろん、これはすでにマクロ展開されたコードには影響しないため、マクロ展開前にアドバイスが確実にインストールされる必要があります。
プリミティブ(What Is a Function?を参照してください)にアドバイスするのは可能ですが、2つの理由により通常は行うべきではありません。1つ目の理由は、いくつかのプリミティブはアドバイスのメカニズム内で使用されているため、それらにたいしてアドバイスを行うと無限再帰が発生するからです。2つ目の理由は、多くのプリミティブがCから直接呼び出されていて、そのような呼び出しはアドバイスを無視するからです。したがって、プリミティブにたいしてアドバイスの使用を控えることは、ある呼び出しはアドバイスにしたがい(Lispコードから呼びだされたため)、他の呼び出しではアドバイスにしたがわない(Cコードから呼び出されたため)という混乱した状況を解決します。
名前つき関数symbolに、アドバイスfunctionを追加します。whereとpropsは、add-function(Primitives to manipulate advicesを参照してください)のときと同じ意味をもちます。
名前つき関数symbolからアドバイスfunctionを取り除きます。functionにアドバイスのnameを指定することもできます。
名前つき関数symbol内にすでにアドバイスfunctionがある場合は、非nilをreturnします。functionにアドバイスのnameを指定することもできます。
名前つき関数symbolにすでに追加されたすべての関数にたいして、functionを呼び出します。functionは2つの引数、アドバイス関数と、そのプロパティーで呼び出されます。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下はadd-functionおよびadvice-addのwhere引数に可能な値で、そのアドバイスfunctionと元の関数が構成されるべき方法を指定します。
:before古い関数の前にfunctionを呼び出します。関数は両方とも同じ引数を受け取り、2つの関数の結合のreturn値は、古い関数のreturn値です。より正確に言うと、2つの関数の結合は、以下のように振る舞います:
(lambda (&rest r) (apply function r) (apply oldfun r))
(add-function :before funvar
function)は、ノーマルフックにたいする(add-hook 'hookvar
function)のような、1関数のフックと同等です。
:after古い関数の後にfunctionを呼び出します。関数は両方とも同じ引数を受け取り、2つの関数の結合のreturn値は、古い関数のreturn値です。より正確に言うと、2つの関数の結合は、以下のように振る舞います:
(lambda (&rest r) (prog1 (apply oldfun r) (apply function r)))
(add-function :after funvar
function)は、ノーマルフックにたいする(add-hook 'hookvar function
'append)のような、1関数のフックと同等です。
:overrideこれは古い関数を新しい関数に完全に置き換えます。もちろん、remove-functionを呼び出した後に、古い関数は復元されます。
:around古い関数のかわりにfunctionを呼び出しますが、古い関数はfunctionの追加の引数になります。これはもっとも柔軟な結合です。たとえば、古い関数を異なる引数で呼び出したり、複数回呼び出したり、letバインディングで呼び出したり、あるときは古い関数に処理を委譲し、またあるときは完全にオーバーライドすることが可能になります。より正確に言うと、2つの関数の結合は、以下のように振る舞います:
(lambda (&rest r) (apply function oldfun r))
:before-while古い関数の前にfunctionを呼び出し、functionがnilをreturnした場合は古い関数を呼び出しません。関数は両方とも同じ引数を受け取り、2つの関数の結合のreturn値は、古い関数のreturn値です。より正確に言うと、2つの関数の結合は、以下のように振る舞います:
(lambda (&rest r) (and (apply function r) (apply oldfun r)))
(add-function :before-while funvar
function)は、run-hook-with-args-until-failureを通じてhookvarが実行されたときの(add-hook
'hookvar function)のような、1関数のフックと同等です。
:before-until古い関数の前にfunctionを呼び出し、functionがnilをreturnした場合だけ古い関数を呼び出します。より正確に言うと、2つの関数の結合は、以下のように振る舞います:
(lambda (&rest r) (or (apply function r) (apply oldfun r)))
(add-function :before-until funvar function)
は、run-hook-with-args-until-successを通じてhookvarが実行されたときの(add-hook
'hookvar function)のような、1関数のフックと同等です。
:after-while古い関数が非nilをreturnした場合だけ、古い関数の後にfunctionを呼び出します。関数は両方とも同じ引数を受け取り、2つの関数の結合のreturn値は、functionのreturn値です。より正確に言うと、2つの関数の結合は、以下のように振る舞います:
(lambda (&rest r) (and (apply oldfun r) (apply function r)))
(add-function :after-while funvar
function)は、run-hook-with-args-until-failureを通じてhookvarが実行されたときの(add-hook
'hookvar function 'append)のような、1関数のフックと同等です。
:after-until古い関数がnilをreturnした場合だけ、古い関数の後にfunctionを呼び出します。より正確に言うと、2つの関数の結合は、以下のように振る舞います:
(lambda (&rest r) (or (apply oldfun r) (apply function r)))
(add-function :after-until funvar
function)は、run-hook-with-args-until-successを通じてhookvarが実行されたときの(add-hook
'hookvar function 'append)のような、1関数のフックと同等です。
:filter-args最初にfunctionを呼び出し、その結果(リスト)を新たな引数として古い関数に渡します。より正確に言うと、2つの関数の結合は、以下のように振る舞います:
(lambda (&rest r) (apply oldfun (funcall function r)))
:filter-return最初に古い関数を呼び出し、その結果をfunctionに渡します。より正確に言うと、2つの関数の結合は、以下のように振る舞います:
(lambda (&rest r) (funcall function (apply oldfun r)))
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
多くのコードは古いdefadviceメカニズムを使用しており、これらの大半はadvice-addにより陳腐化しました。advice-addの実装と意味は、とてもシンプルです。
古いアドバイスは以下のようなものです:
(defadvice previous-line (before next-line-at-end
(&optional arg try-vscroll))
"Insert an empty line when moving up from the top line."
(if (and next-line-add-newlines (= arg 1)
(save-excursion (beginning-of-line) (bobp)))
(progn
(beginning-of-line)
(newline))))
新しいアドバイスメカニズムを使用すれば、これを通常の関数に変換できます:
(defun previous-line--next-line-at-end (&optional arg try-vscroll)
"Insert an empty line when moving up from the top line."
(if (and next-line-add-newlines (= arg 1)
(save-excursion (beginning-of-line) (bobp)))
(progn
(beginning-of-line)
(newline))))
これが実際のprevious-lineを変更しないことは明確です。古いアドバイスには、以下が必要です:
(ad-activate 'previous-line)
一方、新しいアドバイスメカニズムでは、以下が必要です:
(advice-add 'previous-line :before #'previous-line--next-line-at-end)
ad-activateはグローバルな効果をもつことに注意してください。これは、指定された関数にたいして、アドバイスのすべての断片を有効にします。特定のアドバイスだけをアクティブ、または非アクティブにしたい場合、ad-enable-advice、またはad-disable-adviceにより、有効または無効にする必要があります。新しいメカニズムではこの区別はなくなりました。
以下のようなaroundのアドバイスがあるとします:
(defadvice foo (around foo-around)
"Ignore case in `foo'."
(let ((case-fold-search t))
ad-do-it))
(ad-activate 'foo)
これは以下のように変換できます:
(defun foo--foo-around (orig-fun &rest args)
"Ignore case in `foo'."
(let ((case-fold-search t))
(apply orig-fun args)))
(advice-add 'foo :around #'foo--foo-around)
アドバイスのクラスについて、新たな:beforeは、古いbeforeは完全に等価ではないことに注意してください。なぜなら古いアドバイス内では、(たとえばad-set-argを使って)その関数の引数を変更できそれは元の関数が参照する引数値に影響します。しかし新しい:beforeは、setqを通じてアドバイス内の引数をし、その変更は元の関数からの参照に影響しません。この振る舞いにもとづいてbeforeアドバイスを移行するときは、代わりにそれを新たなアドバイス:aroundまたは:filter-argsに変更する必要があるでしょう。
同様に、古いafterアドバイスは、ad-return-valueを変更することによりreturn値を変更できますが、新しい:afterは変更できないので、そのようなafterを移行するときは、かわりにそれらを新しいアドバイス:aroundまたは:filter-returnに変更する必要があるでしょう。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
名前つき関数を陳腐化している(obsolete)とマークすることができます。これは、その関数が将来のある時点で削除されるかもしれないことを意味します。陳腐化しているとマークされた関数を含むコードをバイトコンパイルしたとき、Emacsは警告を発します。また、その関数のヘルプドキュメントは表示されなくなります。他の点においては、陳腐化した関数は他の任意の関数と同様に振る舞います。
関数を陳腐化しているとマークするもっとも簡単な方法は、その関数のdefun定義に(declare (obsolete
…))を配置することです。The declare Formを参照してください。かわりに、以下で説明しているmake-obsolete関数を使うこともできます。
make-obsoleteを使用して、マクロ(Macrosを参照してください)を陳腐化しているとマークすることもできます。これは関数のときと同じ効果をもちます。関数またはマクロにたいするエイリアスも、陳腐化しているとマークできます。これはエイリアス自身をマークし、名前解決される関数またはマクロにたいしてではありません。
この関数は、obsolete-nameを陳腐化しているとマークします。obsolete-nameには関数またはマクロを名前づけるシンボル、、または関数やマクロにたいするエイリアスを指定します。
current-nameがシンボルの場合は、obsolete-nameのかわりにcurrent-nameの使用を促す警告メッセージになります。current-nameは、obsolete-nameにたいするエイリアスである必要はありません。似たような機能をもつ、別の関数かもしれません。current-nameには、警告メッセージとなる文字列も指定できます。メッセージは小文字で始まりピリオドで終えるべきです。nilも指定でき、この場合には警告メッセージに追加の詳細は提供されません。
whenが与えられた場合、それは最初にその関数が陳腐化する時期を示す文字列 — たとえば火付けやリリース番号を指定します。
この便利なマクロは関数obsolete-nameを陳腐化しているとマークするとともに、それを関数current-nameのエイリアスにします。これは以下と等価です:
(defalias obsolete-name current-name doc) (make-obsolete obsolete-name current-name when)
加えて、陳腐化した関数にたいする特定の呼び出し規約をマークできます。
この関数は、functionを呼び出す正しい方法として、引数リストsignatureを指定します。これにより、Emacs Lispプログラムが他の方法でfunctionを呼び出している場合には、Emacsのバイトコンパイラーが警告を発します(それでもコードはバイトコンパイルされます)。whenには、その変数が最初に陳腐化するときを示す文字列(通常はバージョン番号)を指定します。
たとえば、古いバージョンのEmacsでは、sit-forには以下のように3つの引数を指定していました
(sit-for seconds milliseconds nodisp)
しかしこの方法によるsit-forの呼び出しは陳腐化していると判断されます(Waiting for Elapsed Time or Inputを参照してください)。以下のように、古い呼び出し規約は推奨されません:
(set-advertised-calling-convention 'sit-for '(seconds &optional nodisp) "22.1")
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
インライン関数(inline
function)は関数と同様に機能しますが、1つ例外があります。その関数の呼び出しがバイトコンパイルされると(Byte Compilationを参照してください)、その関数の定義が呼び出し元に展開されます。インライン関数を定義するには、defunのかわりにdefsubstを使用します。
このマクロはインライン関数を定義します。マクロの構文はdefunとまったく同じです(Defining Functionsを参照してください)。
関数をインラインにすることにより、その関数の呼び出しが高速になる場合があります。しかし欠点もあります。1つは柔軟性の減少です。その関数の定義を変更した場合、すでにインライン化された呼び出しは、リコンパイルを行うまで古い定義を使用します。
もう1つの欠点は、大きな関数をインライン化することにより、コンパイルされたコードのファイル上およびメモリー上のサイズが増大することです。スピード面でのインライン化の有利性は小さい関数にたいして顕著なので、一般的に大きな関数をインライン化するべきではありません。
インライン関数は、デバッグ、トレース、アドバイス(Advising Emacs Lisp Functionsを参照してください)に際してうまく機能しません。デバッグの容易さと関数の再定義の柔軟さはEmacsの重要な機能なので、スピードがとても重要であり、defunの使用が実際に性能の面で問題となるのか検証するためにすでにコードをチューニングしたのでなければ、たとえその関数が小さくてもインライン化するべきでは
ありません。
インライン関数が実行するのと同じコードに展開されるマクロ(Macrosを参照してください)を定義することは可能です。しかし式内でのマクロの直接の使用には制限があります
—
apply、mapcarなどでマクロを呼び出すことはできません。通常の関数からマクロへの変換には、そのための余分な作業が必要になります。通常の関数をインライン関数に変換するのは簡単です。defunをdefsubstに置き換えるだけです。インライン関数の引数はそれぞれ正確に1回評価されるので、マクロのときのように、bodyで引数を何回使用するか心配する必要はありません。
インライン関数を定義した後、そのインライン展開はマクロ同様、同じファイル内の後の部分で処理されます。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
declare Formdeclare(宣言)は特別なマクロで、関数やマクロに“メタ”プロパティーを追加するために使用できます。たとえば陳腐化しているとマークしたり、Emacs
Lispモード内の特別なTABインデント規則を与えることができます。
このマクロは引数を無視して、nilとして評価され、実行時の効果はありません。しかしdefunまたはdefsubst(Defining Functionsを参照してください)、またはdefmacroマクロ(Defining Macrosを参照してください)の定義のdeclare引数にdeclareフォームがある場合は、specsで指定されたプロパティーを関数またはマクロに追加します。これはdefun、defsubst、defmacroにより特別に処理されます。
specs内の各要素は(property
args…)というフォームをもつべきです。また、クォートするべきではありません。これらは、以下の効果をもちます:
(advertised-calling-convention signature when)これはset-advertised-calling-convention(Declaring Functions Obsoleteを参照してください)の呼び出しと同じように振る舞います。signatureはその関数(またはマクロにたいする正しい引数リスト)で、whenは古い引数リストが最初に陳腐化する時期を示す文字列を指定します。
(debug edebug-form-spec)これはマクロだけに有効です。Edebugでそのマクロ入ったときに、edebug-form-specを使用します。Instrumenting Macro Callsを参照してください。
(doc-string n)それ自身が関数、マクロ、または変数のようなエンティティーを定義するために使用される関数やマクロを定義するときに使用されます。これはn番目の引数を示し、もしあれば、それはドキュメント文字列です。
(indent indent-spec)この関数(またはマクロ)にたいするインデント呼び出しは、indent-specにしたがいます。これは関数でも機能しますが、通常はマクロで使用されます。Indenting Macrosを参照してください。
(obsolete current-name when)make-obsolete(Declaring Functions Obsoleteを参照してください)と同様に、関数(またはマクロ)を陳腐化しているとマークします。current-nameにはシンボル(かわりにこのシンボルを使うことをすすめる警告メッセージになります)、文字列(警告メッセージを指定します)、またはnil(警告メッセージには追加の詳細が含まれません)を指定します。whenには、その関数(またはマクロ)が最初に陳腐化する時期を示す文字列を指定します。
(compiler-macro expander)これは関数だけに使用でき、最適化関数(optimization
function)としてexpanderを使用するようコンパイラーに告げます。(function
args…)のようなその関数への呼び出しフォームに出会うと、マクロ展開機能(macro
expander)はargs…と同様のフォームでexpanderを呼び出します。expanderはその関数呼び出しのかわりに使用するための新しい式、または変更されていないフォーム(その関数呼び出しを変更しないことを示す)のどちらかをreturnすることができます。expanderにはシンボル、またはフォーム(lambda
(arg)
body)を指定できます。フォームの場合、argは元の関数呼び出し式を保持して、その関数の形式に適う引数を使用することにより、その関数にたいする(評価されていない)引数にアクセスできます。
(gv-expander expander)expanderがgv-define-expanderと同様、汎変数としてマクロ(または関数)にたいする呼び出しを処理する関数であることを宣言します。expanderはシンボル、またはフォーム(lambda
(arg) body)を指定できます。フォームの場合、その関数は追加でそのマクロ(または関数)にアクセスできます。
(gv-setter setter)setterが、汎変数としてマクロ(または関数)にたいする呼び出しを処理する関数であることを宣言します。setterはシンボル、またはフォームを指定できます。シンボルの場合、そのシンボルはgv-define-simple-setterに渡されます。フォームの場合は(lambda
(arg)
body)という形式で、その関数は追加でマクロ(または関数)にアクセスでき、gv-define-setterに渡されます。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
あるファイルをバイトコンパイルするとき、コンパイラーが知らない関数について警告が生成されるときがあります(Compiler Errorsを参照してください)。実際に問題がある場合もありますが、問題となっている関数がそのコードの実行時にロードされる他のファイルで定義されている場合が通常です。たとえば以前は、fortran.elをバイトコンパイルすると、以下のような警告が出ていました:
In end of data:
fortran.el:2152:1:Warning: the function `gud-find-c-expr' is not
known to be defined.
実際のところ、gud-find-c-exprは、Fortranモードが使用するgud-find-expr-functionのローカル値(GUDからのコールバック)の中だけで使用されていて、呼びだされた場合はGUD関数がロードされます。そのような警告が実際には問題を示さないことを知っているときには、警告を抑制したほうがよいでしょう。そうすれば、実際に問題があることを示す新しい警告の識別性が良くなります。declare-functionを使用して、これを行うことができます。
必要なのは、問題となっている関数を最初に使用する前にdeclare-function命令を追加するだけです:
(declare-function gud-find-c-expr "gud.el" nil)
これはgud-find-c-exprがgud.el(‘.el’は省略可)の中で定義していることを告げます。コンパイラーは関数がそのファイルで実際に定義されているとみなし、チェックを行いません。
3つ目の引数はオプションで、gud-find-c-exprの引数リストを指定します。この例では、引数はありません(nilと値を指定しないのは、異なります)。それ以外の場合は、(file
&optional
overwrite)のようになります。引数リストを指定する必要はありませんが、指定すればコンパイラーはその呼び出しが宣言と合致するかチェックできます。
バイトコンパイラーにたいして、引数arglistをとるfunctionが定義されていて、その定義はfileにあるとみなすように告げます。fileonlyが非nilの場合は、fileが存在することだけをチェックして、実際のfunctionの定義はチェックしないことを意味します。
これらの関数がdeclare-functionが告げる場所で実際に宣言されているか検証するには、check-declare-fileを使用して、1つのソースファイル中のすべてのdeclare-function呼び出しをチェックするか、check-declare-directoryを使用して、特定のディレクトリー配下のすべてのファイルをチェックします。
これらのコマンドは、locate-libraryで使用する関数の定義を含むべきファイルを探します。ファイルが見つからない場合、これらのコマンドはdeclare-functionの呼び出しを含むファイルをがあるディレクトリーからの相対ファイル名に、定義ファイル名を展開します。
‘.c’や‘.m’で終わるファイル名を指定することにより、プリミティブ関数を指定することもできます。これが有用なのは、特定のシステムだけで定義されるプリミティブを呼び出す場合だけです。ほとんどのプリミティブは常に定義されているので、それらについて警告を受け取ることはありえないはずです。
あるファイルがオプションとして外部のパッケージの関数を使う場合があります。declare-function命令内のファイル名のプレフィクスを‘ext:’にすると、そのファイルが見つかった場合はチェックして、見つからない場合はエラーとせずにスキップします。
‘check-declare’が理解しない関数定義もいくつか存在します(たとえばdefstructや、その他いくつかのマクロ)。そのような場合、declare-functionのfileonly引数に、非nilを渡すことができます。これはファイルの存在だけをチェックして、その関数の実際の定義はチェックしないことを意味します。これを行う場合、引数リストを指定する必要はないのですが、arglist引数にはtをセットするべきだということに注意してください(なぜならnilは、引数リストが指定されなかったという意味ではなく、空の引数リストを意味するからです)。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
SESのようないくつかのメジャーモードは、ユーザーファイル内に格納された関数を呼び出します(See (ses)Top, for more information on SESを参照してください)。 ユーザーファイルには素性があやふやな場合があります — 初対面の人から受け取ったスプレッドシートかもしれず、会ったことのない誰かから受け取ったeメールかもしれません。そのため、ユーザーファイルに格納されたソースコードの関数を呼び出すのは、それが安全だと決定されるすまでは危険です。
formが安全(safe)なLisp式の場合はnil、危険な場合はなぜその式が危険かもしれないのか説明するリストをreturnします。引数unsafep-varsは、この時点で一時的なバインドだと判っているシンボルのリストです。これは主に内部的な再帰呼び出しで使用されます。カレントバッファーは暗黙の引数になり、これはバッファーローカルなバインディングのリストを提供します。
高速かつシンプルにするために、unsafepは、とても軽量な分析を行うので、実際には安全な多くのLisp式を拒絶します。安全ではない式にたいして、unsafepがnilをreturnするケースは確認されていません。しかし“安全”なLisp式はdisplayプロパティーと一緒に文字列をreturnでき、これはその文字列がバッファーに挿入された後に実行される、割り当てられたLisp式を含みます。割り当てられた式は、ウィルスかもしれません。安全であるためには、バッファーへ挿入する前に、ユーザーコードにより計算されたすべての文字列からプロパティーを削除しなければなりません。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下のテーブルは、関数呼び出しと関数定義に関連したことを行ういくつかの関数です。これらは別の場所で説明されているので、ここではクロスリファレンスを提供します。
applyCalling Functionsを参照してください。
autoloadAutoloadを参照してください。
call-interactivelyInteractive Callを参照してください。
called-interactively-pDistinguish Interactive Callsを参照してください。
commandpInteractive Callを参照してください。
documentationAccess to Documentation Stringsを参照してください。
evalEvalを参照してください。
funcallCalling Functionsを参照してください。
functionAnonymous Functionsを参照してください。
ignoreCalling Functionsを参照してください。
indirect-functionSymbol Function Indirectionを参照してください。
interactiveUsing interactiveを参照してください。
interactive-pDistinguish Interactive Callsを参照してください。
mapatomsCreating and Interning Symbolsを参照してください。
mapcarMapping Functionsを参照してください。
map-char-tableChar-Tablesを参照してください。
mapconcatMapping Functionsを参照してください。
undefinedFunctions for Key Lookupを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マクロ(macros)は、新たな制御構造や、他の言語機能の定義を可能にします。マクロは関数のように定義されますが、値の計算方法を指定するかわりに、値を計算する別のLisp式を計算する方法を指示します。わたしたちはこの式のことをマクロの展開形(expansion)と呼んでいます。
マクロは、関数が行うように引数の値を処理するのではなく、引数のために未評価の式を処理することにより、これを行うことができます。したがってマクロは、これらの引数式またはその一部をを含む式を構築することができます。
マクロを使用して通常の関数が行えることを行う場合、単にそれが速度面の理由ならば、かわりにインライン関数の使用を考慮してください。Inline Functionsを参照してください。
| 13.1 A Simple Example of a Macro | 基本的な例。 | |
| 13.2 Expansion of a Macro Call | いつ、なぜ、どのようにしてマクロが展開されるか。 | |
| 13.3 Macros and Byte Compilation | コンパイラーによりマクロが展開される方法。 | |
| 13.4 Defining Macros | マクロ定義を記述する方法。 | |
| 13.5 Common Problems Using Macros | マクロ引数を何回も評価しないこと。ユーザーの変数を隠さないこと。 | |
| 13.6 Indenting Macros | マクロ呼び出しのインデント方法の指定。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Cの++演算子のように、変数の値をインクリメントするためのLisp構造を定義したいとします。(inc
x)のように記述すると、(setq x (1+ x))という効果を得たいとします。以下はこれを行うマクロ定義です:
(defmacro inc (var) (list 'setq var (list '1+ var)))
これを(inc x)のように呼び出すと、引数varはシンボルxになります —
関数のときのようにxの値ではありません。このマクロのbodyはこれを展開の構築に使用して、展開形は(setq
x (1+ x))になります。マクロが1度この展開形をreturnすると。Lispはそれを評価するので、xはインクリメントされます。
この術後は、その引数がマクロかどうかテストして、もしマクロならt、それ以外はnilをreturnします。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マクロ呼び出しは、関数の呼び出しと同じ外観をもち、マクロの名前で始まるリストで表されます。そのリストの残りの要素は、マクロの引数になります。
マクロ呼び出しの評価は、1つの重大な違いを除き、関数の評価と同じように開始されます。重要な違いとは、そのマクロの引数はマクロ呼び出し内で実際の式として現れます。これらの引数はマクロ定義に与えられる前には評価されません。対象的に、関数の引数は、その関数の呼び出しリストの要素を評価した結果です。
こうして得た引数を使用して、Lispは関数呼び出しのように、マクロ定義を呼び出します。マクロの引数変数はマクロ呼び出しの引数値にバインドされるか、a
&rest引数の場合は引数地のリストになります。そして、そのマクロのbodyが実行されて、関数bodyが行うように、マクロbodyの値をreturnsします。
マクロと関数の2つ目の重要な違いは、マクロのbodyからreturnされる値が、代替となるLisp式であることで、これはマクロの展開(expansion)としても知られます。Lispインタープリターは、マクロから展開形が戻されると、すぐにその展開形の評価を行います。
展開形は通常の方法で評価されるので、もしかしたらその展開形は他のマクロの呼び出しを含むかもしれません。一般的ではありませんが、もしかすると同じマクロを呼び出すかもしれません。
EmacsはコンパイルされていないLispファイルをロードするときに、マクロの展開を試みることに注意してください。これは常に利用可能ではありませんが、もし可能なら、それ以降の実行の速度を改善します。How Programs Do Loadingを参照してください。
macroexpandを呼び出すことにより、与えられたマクロ呼び出しにたいする展開形を確認することができます。
この関数は、それがマクロ呼び出しの場合は、formを展開します。結果が他のマクロ呼び出しの場合は、結果がマクロ呼び出しでなくなるまで、順番に展開を行います。これはmacroexpandからreturnされる値になります。formがマクロ呼び出しで開始されない場合、与えられたformをそのままreturnします。
macroexpandは、(たとえいくつかのiマクロ定義がそれを行っているとしても)formの部分式(subexpression)を調べないことに注意してください。たとえ部分式自身がマクロ呼び出しの場合でも、macroexpandはそれらを展開しません。
関数macroexpandは、インライン関数の呼び出しを展開しません。なぜならインライン関数の呼び出しは、通常の関数呼び出しと比較して理解が難しい訳ではないので、通常はそれを行う必要がないからです。
environmentが与えられた場合、それはそのとき定義されているマクロをシャドーするマクロのalistを指定します。バイトコンパイルはこの機能を使用します。
(defmacro inc (var)
(list 'setq var (list '1+ var)))
(macroexpand '(inc r))
⇒ (setq r (1+ r))
(defmacro inc2 (var1 var2)
(list 'progn (list 'inc var1) (list 'inc var2)))
(macroexpand '(inc2 r s))
⇒ (progn (inc r) (inc s)) ; ここではincは展開されない。
macroexpand-allはmacroexpandと同様、マクロを展開しますが、ドップレベルだけではなく、form内のすべてのマクロを探して展開します。展開されたマクロがない場合、return値は、formとeqになります。
上記macroexpandで使用した例をmacroexpand-allに用いると、macroexpand-allがincに埋め込まれた呼び出しの展開を行うことを確認できます:
(macroexpand-all '(inc2 r s))
⇒ (progn (setq r (1+ r)) (setq s (1+ s)))
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
なぜわざわざマクロにたいする展開形を計算して、その後に展開形を評価する手間をかけるのか、不思議に思うかもしれません。なぜマクロbodyは直接望ましい結果を生成しないのでしょうか? それはコンパイルする必要があるからです。
コンパイルされるLispプログラム内にマクロ呼び出しがあるとき、Lispコンパイラーはインタープリターが行うようにマクロ定義を呼び出して、展開形を受け取ります。しかし展開形を評価するかわりに、コンパイラーは展開形が直接プログラム内にあるかのようにコンパイルを行います。結果として、コンパイルされたコードはそのマクロにたいする値と副作用を生成しますが、実行速度は完全にコンパイルされた行されたときと同じになります。もしマクロbody自身が値と副作用を計算したら。このようには機能しません — コンパイル時に計算されることになり、それは有用ではありません。
マクロ呼び出しのコンパイルが機能するためには、マクロを呼び出すコードがコンパイルされるとき、そのマクロがLisp内ですでに定義されていなければなりません。コンパイラーには、これを行うのを助ける特別な機能があります。コンパイルされるファイルがdefmacroフォームを含む場合、そのファイルの残りの部分をコンパイルするために、そのマクロが一時的に定義されます。
ファイルをバイトコンパイルすると、ファイル内のトップレベルにある任意のrequire呼び出しも実行されるので、それらを定義しているファイルをrequireすることにより、コンパイルの間、必要なマクロ定義が利用できることが確実になります(Featuresを参照してください)。誰かがコンパイルされたプログラムを実行するときに、マクロ定義ファイルのロードをしないようにするには、require呼び出しの周囲にeval-when-compileを記述します(Evaluation During Compilationを参照してください)。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lispのマクロオブジェクトは、CARがmacroで、CDRが関数のリストです。マクロの展開形は、マクロ呼び出しから、評価されていない引数のリストに、(applyを使って)関数を適用することにより機能します。
無名関数のように無名Lispマクロを使用することも可能ですが、無名マクロをmapcarのようなファンクショナルに渡すことに意味がないので、これが行われることはありません。実際のところ、すべてのLispマクロは名前をもち、ほとんど常にdefmacroマクロで定義されます。
defmacroはシンボルname(クォートはしない)を、以下のようなマクロ押して定義します:
(macro lambda args . body)
(このリストのCDRはラムダ式であることに注意してください。)
このマクロオブジェクトは、nameの関数セルに格納されます。argsの意味は関数の場合と同じで、キーワード&restおよび&optionalが使用されることもあります(Other Features of Argument Listsを参照してください)。nameとargsはどちらも、クォートされるべきではありません。defmacroのreturn値は未定義です。
docが与えられた場合、それはマクロのドキュメント文字列を指定する文字列です。declareが与えられた場合、それはマクロのメタデータを指定するdeclareフォームです(The declare Formを参照してください)。マクロを対話的に呼び出すことはできないので、インタラクティブ宣言をもつことはできないことに注意してください。
マクロが、定数部と非定数部の混合体から構築される巨大なリスト構造を必要とする場合があります。これを簡単に行うためには、‘`’構文(Backquoteを参照してください)を使用します。たとえば:
(defmacro t-becomes-nil (variable)
`(if (eq ,variable t)
(setq ,variable nil)))
(t-becomes-nil foo)
≡ (if (eq foo t) (setq foo nil))
マクロ定義のbodyには、そのマクロに関する追加のプロパティーを指定する、declareフォームを含めることができます。The declare Formを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マクロ展開が、直感に反する結果となることがあり得ます。このセクションでは、問題になりかねない重要な結果と、問題を避けるためにしたがうべきルールをいくつか説明します。
| 13.5.1 Wrong Time | マクロ内ではなく展開形で作業を行う。 | |
| 13.5.2 Evaluating Macro Arguments Repeatedly | 展開形は各マクロ引数を1度評価するべきです。 | |
| 13.5.3 Local Variables in Macro Expansions | 展開形でのローカル変数バインディングには特別な注意が必要です。 | |
| 13.5.4 Evaluating Macro Arguments in Expansion | 評価せずに展開形の中に配置してください。 | |
| 13.5.5 How Many Times is the Macro Expanded? | 展開が行われる回数への依存を避ける。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マクロを記述する際のもっとも一般的な問題は、展開形の中ではなく、マクロ展開中に、早まって実際に何らかの作業を行ってしまうことがあります。たとえば、実際のパッケージが以下のマクロ定義をもつとします:
(defmacro my-set-buffer-multibyte (arg)
(if (fboundp 'set-buffer-multibyte)
(set-buffer-multibyte arg)))
この誤ったマクロ定義は、解釈(interpret)されるときは正常に機能しますが、コンパイル時に失敗します。このマクロ定義はコンパイル時にset-buffer-multibyteを呼び出してしまいますが、それは間違っています。その後でコンパイルされたパッケージを実行しても何も行いません。プログラマーが実際に望むのは、以下の定義です:
(defmacro my-set-buffer-multibyte (arg)
(if (fboundp 'set-buffer-multibyte)
`(set-buffer-multibyte ,arg)))
このマクロは、もし適切ならset-buffer-multibyteの呼び出しに展開され、それはコンパイルされたプログラム実行時に実行されるでしょう。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マクロを定義する場合、展開形が実行されるときに引数が何回評価されるか注意を払わなければなりません。以下の(繰り返し処理を用意にする)マクロで、この問題を示してみましょう。このマクロで“for”によるループ構造を記述できます。
(defmacro for (var from init to final do &rest body)
"Execute a simple \"for\" loop.
For example, (for i from 1 to 10 do (print i))."
(list 'let (list (list var init))
(cons 'while
(cons (list '<= var final)
(append body (list (list 'inc var)))))))
(for i from 1 to 3 do (setq square (* i i)) (princ (format "\n%d %d" i square))) →
(let ((i 1))
(while (<= i 3)
(setq square (* i i))
(princ (format "\n%d %d" i square))
(inc i)))
-|1 1
-|2 4
-|3 9
⇒ nil
マクロ内の引数from、to、doは、“構文糖(syntactic
sugar)”であり、完全に無視されます。このアイデアは、マクロ呼び出し中で(from, to, and
doのような)余計な単語を、これらの位置に記述できるようにするというものです。
以下は、バッククォートの使用により、より単純化された等価の定義です:
(defmacro for (var from init to final do &rest body)
"Execute a simple \"for\" loop.
For example, (for i from 1 to 10 do (print i))."
`(let ((,var ,init))
(while (<= ,var ,final)
,@body
(inc ,var))))
この定義のフォームは両方(バッククォートのあるものと、ないもの)とも、各繰り返しにおいて毎回finalが評価されるという欠点をもちます。finalが定数のときには、問題はありません。しかし、これがより複雑な、たとえば(long-complex-calculation
x)のようなフォームの場合、実効速度は顕著に低下し得ます。finalが副作用をもつ場合には、複数回実行すると、おそらく正しくなくなります。
うまく設計されたマクロ定義は、繰り返し評価することがそのマクロの意図された目的でない限り、引数を正確に1回評価を行う展開形を生成することにより、この問題を避けるためにステップを費やします。以下はforマクロの正しい展開形です:
(let ((i 1)
(max 3))
(while (<= i max)
(setq square (* i i))
(princ (format "%d %d" i square))
(inc i)))
以下はこの展開形を生成するためのマクロ定義です:
(defmacro for (var from init to final do &rest body)
"Execute a simple for loop: (for i from 1 to 10 do (print i))."
`(let ((,var ,init)
(max ,final))
(while (<= ,var max)
,@body
(inc ,var))))
残念なことに、この訂正により、以下のセクションで説明する、別の問題が発生します。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
前のセクションでは、forの定義を、展開形がマクロ引数を正しい回数評価するように訂正しました:
(defmacro for (var from init to final do &rest body) "Execute a simple for loop: (for i from 1 to 10 do (print i))."
`(let ((,var ,init)
(max ,final))
(while (<= ,var max)
,@body
(inc ,var))))
forの新しい定義には、新たな問題があります。この定義は、ユーザーが意識していない、maxという名前のローカル変数を導入しています。これは、以下の例で示すようなトラブルを招きます:
(let ((max 0))
(for x from 0 to 10 do
(let ((this (frob x)))
(if (< max this)
(setq max this)))))
forのbodyの内部のmaxへの参照は、maxのユーサーバインディングの参照を意図したものですが、実際にはforにより作られたバインディングにアクセスします。
これを修正する方法は、maxのかわりにinternされていない(uninterned)シンボルを使用することです(Creating and Interning Symbolsを参照してください)。internされていないシンボルは他のシンボルと同じようにバインドして参照することができますが、forにより作成されるので、わたしたちはすでにユーザーのプログラムに存在するはずがないことを知ることができます。これはinternされていないので、プログラムの後続の部分でそれを配置する方法はありません。これはforにより配置された場所をのぞき、他の場所で配置されることはありません。以下はこの方法で機能するforの定義です:
(defmacro for (var from init to final do &rest body)
"Execute a simple for loop: (for i from 1 to 10 do (print i))."
(let ((tempvar (make-symbol "max")))
`(let ((,var ,init)
(,tempvar ,final))
(while (<= ,var ,tempvar)
,@body
(inc ,var)))))
作成されたinternされていないシンボルの名前はmaxで、これを通常のinternされたシンボルmaxのかわりに、式内のその位置に記述します。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マクロ定義自体が、eval(Evalを参照してください)の呼び出しなどによりマクロ引数式を評価した場合には、別の問題が発生します。その引数がユーザーの変数を参照する場合、ユーザーがマクロ引数と同じな前で変数をしようとした場合に問題となるでしょう。マクロのbodyないでは、マクロ引数のバインディングは、その変数のもっともローカルなバインディングなので、そのフォーム内部の任意の参照は、それを参照するように評価されます。以下は例です:
(defmacro foo (a) (list 'setq (eval a) t))
(setq x 'b)
(foo x) → (setq b t)
⇒ t ; bがセットされる。
;; but
(setq a 'c)
(foo a) → (setq a t)
⇒ t ; しかし、これはcではなくaがセットされる。
ユーザーの変数の名前がaかxかということで、違いが生じています。これはaが、マクロの引数変数aと競合しているからです。
マクロ定義内でのevalの呼び出しにまつわる別の問題は、それがおそらくコンパイル時にあなたが意図したことを行わないだろうということです。バイトコンパイラーは、そのプログラム自身の(あなたがevalでアクセスしたいと望む)計算は発生せず、ローカル変数バインディングも存在しないプログラムのコンパイル時にマクロ定義を実行します。
この問題を避けるためには、マクロ展開形の計算では引数式を評価しないでください。かわりにその式をマクロ展開形の中に置き換えれば、その値は展開形の実行の一部として計算されます。これは、このチャプターの他の例が機能する方法です。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マクロ呼び出しは逐次解釈される関数で毎回マクロ呼び出しが展開されるが、コンパイルされた関数では(コンパイル時に)1回だけしか展開されないという事実にもとづく問題が、時折発生します。そのマクロ定義が副作用をもつ場合、それらのマクロは、そのマクロが難解展開されたかにより、異なる動作をとるでしょう。
したがって、あなたが何をしているか本当に判っていないのであれば、マクロ展開形の計算での副作用は避けるべきです。
避けることのできない特殊な副作用が1つあります。それはLispオブジェクトの構築です。ほとんどすべてのマクロ展開形には、リストの構築が含まれます。リスト構築はほとんどのマクロの核心部分です。これは通常は安全です。用心しなければならないケースが1つだけあります。それは構築するオブジェクトが、マクロ展開形の中でクォートされた定数の一部となるときです。
そのマクロが1回だけ — コンパイル時 — しか展開されない場合、そのオブジェクトの構築もコンパイル時の1回です。しかし逐次実行では、そのマクロはマクロ呼び出しが実行されるたびに展開され、これは毎回新たなオブジェクトが構築されることを意味します。
クリーンなLispコードのほとんどでは、この違いは問題になりません。しかし、マクロ定義によるオブジェクト構築の副作用を処理する場合には、問題になるかもしれません。したがって問題を避けるために、マクロ定義によるオブジェクト構築の副作用を避けてください。以下は副作用により問題が起こる例です:
(defmacro empty-object () (list 'quote (cons nil nil)))
(defun initialize (condition)
(let ((object (empty-object)))
(if condition
(setcar object condition))
object))
initializeが解釈された場合、initializeが呼び出されるたびに、新しいリスト(nil)が構築されます。したがって、各呼び出しの間において、副作用は存続しません。しかしinitializeがコンパイルされた場合、マクロempty-objectはコンパイル時に展開され、これは1つの“定数”(nil)を生成し、この定数はinitializeの毎回の呼び出しで、再利用・変更されます。
このような異常な状態を避ける1つの方法は、empty-objectを、メモリー割り当て構造ではなく、一種の奇妙な変数と考えることです。'(nil)のような定数にたいしてsetcarを使うことはないでしょうから、当然(empty-object)にも使うことはないでしょう。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マクロ定義では、マクロ呼び出しをTABがどのようにインデントすべきか指定するために、declareフォーム(Defining Macrosを参照してください)を使うことができます。インデント指定は以下のように記述します:
(declare (indent indent-spec))
以下は利用できるindent-specです:
nilこれはプロパティーを指定しない場合と同じ — 標準的なインデントパターンを使用します。
defunこの関数を‘def’構造 — 2番目の行がbodyの開始 — と同様に扱います。
関数の最初のnumber個の引数は区別され、残りは式のbodyと判断されます。その式の中の行は、最初の引数が区別されているかどうかにしたがってインデントされます。引数がbodyの一部である場合、その行はこの式の先頭の
開きカッコ(open-parenthesis)よりもlisp-body-indentだけ多い列にインデントされます。引数が
区別されていて、1つ目または2つ目の引数である場合は、2倍余分にインデントされます。引数が区別されていて1つ目あるいは2つ目の引数でない場合、その行は標準パターンによってインデントされます。
symbolは関数名です。その関数はこの式のインデントを計算するために呼び出される関数です。この関数は2つの引数をとります:
その行のインデントが開始される位置です。
その行の開始まで解析されたとき、parse-partial-sexp(インデントとネスト深さの計算のためのLispプリミティブ)によりreturnされる値です。
これは、数(その行のインデントの列数)、またはそのような数がcarであるようなリストをreturnすべきです。数とリストの違いは、数の場合、同じネスト深さの後続のすべての行はこの数と同じインデントとなります。リストの場合、後続の行は異なるインデントを呼び出すかもしれません。これは、C-M-qによりインデントが計算されるときに違いがでます。値が数の場合、C-M-qはリストの終わりまでの後続の行のインデントを、再計算する必要はありません。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacsのユーザーは、カスタマイズインターフェースにより、Lispコードを記述することなく。変数とフェースをカスタマイズできます。Easy Customization in The GNU Emacs Manualを参照してください。このチャプターでは、カスタマイズインターフェースを通じて、ユーザーとやりとりするための、カスタマイズアイテム(customization items)を定義する方法を説明します。
カスタマイズアイテムには、カスタマイズ可能変数(customizable variable:
defcustomマクロで定義される。
カスタマイズ可能フェース(customizable face: deffaceで定義される。Defining Facesを参照してください)、および関連するカスタマイズアイテムのグループのためのコンテナーとして働くカスタマイズグループ(customization
group:
defgroupで定義される)
が含まれます。
| 14.1 Common Item Keywords | すべての種類のカスタマイズ宣言に共通なキーワード。 | |
| 14.2 Defining Customization Groups | カスタマイズグループ定義の記述。 | |
| 14.3 Defining Customization Variables | ユーザーオプションの宣言。 | |
| 14.4 Customization Types | ユーザーオプションの型指定。 | |
| 14.5 Applying Customizations | カスタマイズセッティングを適用する関数。 | |
| 14.6 Custom Themes | カスタムテーマの記述。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以降のセクションで説明するカスタマイズ宣言(customization declaration) —
defcustom、defgroupなどはすべて、さまざまな情報を指定するためのキーワード引数(Variables that Never Changeを参照してください)を受け取ります。このセクションでは、カスタマイズ宣言のすべての種類に適用されるキーワードを説明します。
:tag以外のすべてのキーワードは、与えられたアイテムにたいして複数回使用できます。キーワードの使用はそれぞれ独立した効果をもちます。:tagは例外で、これはすべての与えられたアイテムは1つの名前だけを表示できるからです。
:tag labellabelを使用すると、カスタマイズメニュー(customization menu)およびカスタマイズバッファー(customization buffer)のアイテムのラベルづけに、そのアイテムの名前のかわりに指定された文字列を使用します。混乱を招くので、そのアイテムの実際の名前と、大きく異なる名前は使用しないでください。
:group groupこのカスタマイズアイテムを、グループgroupに配します。defgroup内で:groupを使用した場合、そのアイテムは新しいグループ(:groupのサブグループ)になります。
このキーワードを複数回使用した場合、1つのアイテムを複数のグループに配すことができます。これらのグループのどれかを表示すると、このアイテムが表示されます。煩わしくなるので、多用しないでください。
:link link-dataこのアイテムのドキュメント文字列の後に外部リンクを含めます。これは他のドキュメントを参照する、センテンスを含むボタンです。
link-dataに使用できる複数の候補があります:
(custom-manual info-node)infoノードへのリンクです。info-nodeは、"(emacs)Top"のような、ノード名を示す文字列です。このリンクはカスタマイズバッファーの‘[Manual]’に表示され、info-nodeにたいしてビルトインのinfoリーダーを起動します。
(info-link info-node)custom-manualと同様ですが、カスタマイズバッファーには、そのinfoノード名が表示されます。
(url-link url)ウェブページヘのリンクです。urlはURLを指定する文字列です。カスタマイズバッファーに表示されるリンクは、browse-url-browser-functionで指定されたWWWブラウザーを呼び出します。
(emacs-commentary-link library)ライブラリーのコメントセクション(commentary section)へのリンクです。libraryはライブラリー名を指定する文字列です。Conventional Headers for Emacs Librariesを参照してください。
(emacs-library-link library)Emacs Lispライブラリーファイルへのリンクです。libraryはライブラリー名を指定する文字列です。
(file-link file)ファイルへのリンクです。fileは、ユーザーがこのリンクを呼び出したときにfind-fileでvisitするファイルの名前を指定する文字列です。
(function-link function)関数のドキュメントへのリンクです。functionは、ユーザーがこのリンクを呼び出したときにdescribe-functionで説明を表示する関数の名前を指定する文字列です。
(variable-link variable)変数のドキュメントへのリンクです。variableは、ユーザーがこのリンクを呼び出したときにdescribe-variableで説明を表示する変数の名前を指定する文字列です。
(custom-group-link group)他のカスタマイズグループへのリンクです。このリンクを呼び出すことにより、groupにたいする新たなカスタマイズバッファーが作成されます。
link-dataの1つ目の要素の後に:tag
nameを追加することにより、カスタマイズバッファーで使用するテキストを指定できます。たとえば(info-link :tag
"foo" "(emacs)Top")は、そのバッファーで‘foo’と表示されるEmacs manualへのリンクを作成します。
複数のリンクを追加するために、このキーワードを複数回使用することができます。
:load fileこのカスタマイズアイテムを表示する前に、ファイルfileをロードします(Loadingを参照してください)。ロードはloadにより行われ、そのファイルがまだロードされていないときだけロードします。
:require feature保存したカスタマイズが、このアイテム値をセットするとき、(require
'feature)が実行されます。featureはシンボルです。
:requireを使用するもっとも一般的な理由は、ある変数がマイナーモードのような機能を有効にするとき、そのモードを実装するコードがロードされていない場合には、変数をセットするだけでは効果がないからです。
:version versionこのキーワードは、そのアイテムが最初に導入されたEmacsバージョンversion、またはそのアイテムのデフォルト値がそのバージョンで変更されたことを指定します。値versionは文字列でなければなりません。
:package-version '(package . version)このキーワードは、そのアイテムが最初に導入されたpackageのバージョンversionまたはアイテムの意味(またはデフォルト値)が変更されたバージョンを指定します。このキーワードは:versionより優先されます。
packageにはそのパッケージの公式名をシンボルとして指定します(たとえばMH-E)。versionには文字列を指定します。パッケージpackageがEmacsの一部としてリリースされた場合、packageとversionの値は、customize-package-emacs-version-alistの値に表示されるべきです。
Emacsの一部として配布された:package-versionキーワードを使用するパッケージは、customize-package-emacs-version-alist変数も更新しなければなりません。
このalistは、Emacsのバージョンにたいして、:package-versionキーワード内でリストされたパッケージのバージョンへのマッピングを提供します:
(package (pversion . eversion)…)
package(シンボル)それぞれにたいして、パッケージバージョンpversionを含む1つ以上の要素と、それに関連づけられるEmacsバージョンeversionが存在します。これらのバージョンは文字列です。たとえばMH-Eパッケージは、以下でalistを更新します:
(add-to-list 'customize-package-emacs-version-alist
'(MH-E ("6.0" . "22.1") ("6.1" . "22.1") ("7.0" . "22.1")
("7.1" . "22.1") ("7.2" . "22.1") ("7.3" . "22.1")
("7.4" . "22.1") ("8.0" . "22.1")))
packageの値は一意である必要があり、また:package-versionキーワード内に現れるpackageの値とマッチする必要があります。おそらくユーザーはエラーメッセージからこの値を見るので、MH-EやGnusのようなパッケージの公式名を選択するのがよいでしょう。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lispパッケージはそれぞれ、1つのメインカスタマイズグループ(main customization group)をもち、それにはすべてのオプション、フェイス、そのパッケージ内の他のグループが含まれるべきです。そのパッケージには少数のオプションとフェイスしかない場合は、1つのグループだけを使用して、その中にすべてを置きます。20以上のオプションやフェイスがある場合には、それらをサブグループ内に構造化して、そのサブグループをメインカスタマイズグループの下に配します。そのパッケージ内の任意のオプションまたはフェイスを、サブグループと並行してメイングループに配しても構いません。
そのパッケージのメイングループ(または唯一のグループ)は、1つ以上の標準カスタムグループ(standard customization
group)のメンバーであるべきです(これらの完全なリストを表示するには、M-x
customizeを使用します)。それらの内から1つ以上(多すぎないこと)を選択して、:groupを使用してあなたのグループをそれらに追加します。
新しいカスタマイズグループは、defgroupで宣言します。
membersを含む、カスタマイズグループとして、groupを宣言します。シンボルgroupはクォートしません。引数docは、そのグループにたいするドキュメント文字列を指定します。
引数membersは、そのグループのメンバーとなるカスタマイズアイテムの初期セットを指定するリストです。しかしほとんどの場合はmembersをnilにして、メンバーを定義するときに:groupキーワードを使用することにより、そのグループのメンバーを指定します。
membersを通じてグループのメンバーを指定したい場合、各要素は(name
widget)という形式で指定するべきです。ここでnameはシンボル、widgetはそのシンボルを編集するウィジェット型(widget
type)です。有用なウィジェットには、変数にたいするcustom-variable、フェイスにたいするcustom-face、グループにたいするcustom-groupがあります。
Emacsに新しいグループを導入するときは、defgroup内で:versionキーワードを使用します。そうすればグループの個別のメンバーに対してそれを使用する必要がなくなります。
一般的なキーワード(Common Item Keywordsを参照してください)に加えて、defgroupないでは以下のキーワードも使用できます:
:prefix prefixグループ内のアイテムの名前がprefixで始まり、カスタマイズ変数custom-unlispify-remove-prefixesが非nilの場合、そのアイテムのタグからprefixが省略されます。グループは任意の数のプレフィクスをもつことができます。
この変数が非nilの場合、グループの:prefixキーワードで指定されたプレフィクスは、ユーザーがグループをカスタマイズするときは常に、タグ名から省略されます。
デフォルト値はnil、つまりプレフィクス省略(prefix-discarding)の機能は無効です。これは、オプションやフェイスの名前にたいしてプレフィクスを省略するのは、混乱を招くことがあるからです。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
カスタマイズ可能変数(customizable variable)はユーザーオプション(user
option)とも呼ばれ、これはCustomizeインターフェースを通じてセットできるグローなるなLisp変数です。defvar(Defining Global Variablesを参照してください)により定義される他のグローバル変数とは異なり、カスタマイズ可能変数はdefcustomマクロを使用して定義されます。サブルーチンとしてdefvarを呼び出すことに加え、defcustomはCustomizeインターフェースでその変数が表示される方法や、その変数がとることができる値などを明示します。
このマクロはユーザーオプション(またはカスタマイズ可能変数)としてoptionを宣言します。optionはクォートするべきではありません。
引数standardは、optionの標準値を指定する式です。defcustomフォームの評価により、standardが評価されますが、その値にオプションをバインドする必要はありません。optionがすでにデフォルト値をもつ場合、それは変更されずに残ります。ユーザーがすでにoptionにたいするカスタマイズを保存している場合、ユーザーによりカスタマイズされた値がデフォルト値としてインストールされます。それ以外は、standardを評価した結果がデフォルト値としてインストールされます。
defvarと同様、このマクロはoptionをスペシャル変数 — 常にダイナミックにバインドされるべきことを意味する
—
としてマークします。optionがすでにレキシカルバインドをもつ場合、そのレキシカルバインドはバインディング構造を抜けるまで効果をもちます。Scoping Rules for Variable Bindingsを参照してください。
式standardは別の様々な機会にも — カスタマイズ機能がoptionの標準値を知る必要があるときは常に — 評価される可能性があります。そのため任意回数評価しても安全な式を使用するように気をつけてください。
引数docは、その変数にたいするドキュメント文字列を指定します。
defcustomが何も:groupを指定しない場合、同じファイル内でdefgroupにより最後に定義されたグループが使用されます。この方法では、ほとんどのdefcustomは明示的な:groupが必要なくなります。
Emacs
LispモードでC-M-x(eval-defun)によりdefcustomフォームを評価するとき、eval-defunの特別な機能は、変数の値がvoidかどうかテストせず、無条件に変数をセットする段取りをします(同じ機能はdefvarにも適用されます。Defining Global Variablesを参照してください)。すでに定義されたdefcustomでeval-defunを使用することにより、(もしあれば):set関数が呼び出されます(以下参照)。
事前ロード( pre-loaded)されたEmacs Lispファイル(Building Emacsを参照してください)にdefcustomを配した場合、ダンプ時にインストールされた標準値は正しくない —
たとえば依存している他の変数は、まだ正しい値を割り当てられていない
— かもしれません。この場合、Emacs起動後に標準値を再評価するために、以下で説明するcustom-reevaluate-settingを使用します。
Common Item Keywordsにリストされたキーワードに加え、このマクロには以下のキーワードを指定できます:
:type typeこのオプションのデータ型として、typeを使用します。これはどんな値が適正なのか、その値をどのように表示するかを指定します(Customization Typesを参照してください)。
:options value-listこのオプションに使用する適正な値のリストを指定します。ユーザーが使用できる値はこれらの値に限定されませんが、これらは便利な候補値を提示します。
これは特定の型にたいしてだけ意味をもち、現在のところhook、plist、alistが含まれます。:optionsの使用法の説明は、個別の型の定義を参照してください。
:set setfunctionCustomizeインターフェースを使用してこのオプションの値を変更する方法として、setfunctionを指定します。関数setfunctionは2つの引数
— シンボル(オプション名)と新しい値 —
をとり、このオプションにたいして正しく値を更新するために必要なことは何であれ行うべきです(これはおそらくLisp変数として単にオプションをセットすることを意味しないでしょう)。望ましくは、この関数は引数の値を破壊的に変更するべきではありません。setfunctionのデフォルトは、set-defaultです。
このキーワードを指定した場合、その変数のドキュメント文字列には、手入力のLispコードで同じことを行う方法が記載されるべきです。
:get getfunctionこのオプションの値を抽出する方法として、getfunctionを指定します。関数getfunctionは1つの引数(シンボル)をとり、カスタマイズがそのシンボル(シンボルのLisp値である必要はない)にたいする“カレント値”としてそれを使うべきかreturnするべきです。デフォルトはdefault-valueです。
:getを正しく使用するためには、Customの機能を真に理解する必要があります。これは変数としてCustom内で扱われる値のためのものですが、実際にはLisp変数に格納されません。実際にLisp変数に格納されている値にgetfunctionを指定するのは、ほとんどは誤りです。
:initialize functionfunctionは、defcustomが評価されるときに変数を初期化するために使用される関数であるべきです。これは2つの引数
— オプション名(シンボル)と値をとります。この方法での使用のために事前定義された関数がいくつかあります:
custom-initialize-set変数の初期化に、その変数の:set関数を使用しますが、値がすでに非voidの場合、再処帰化を行いません。
custom-initialize-defaultcustom-initialize-setと同様ですが、その変数の:setのかわりに、関数set-defaultを使用して変数をセットします。これは変数の:set関数がマイナーモードを有効または無効にする場合の、通常の選択です。この選択により、変数の定義ではマイナーモード関数を呼び出しませんが、変数をカスタマイズしたときはマイナーモード関数を呼び出します。
custom-initialize-reset変数の初期化に、常に:set関数を使用します。変数がすでに非voidの場合、(:getメソッドでreturnされる)カレント値を使用して:set関数を呼び出して変数をリセットします。これはデフォルトの:initialize関数です。
custom-initialize-changed変数がすでにセットされている、またはカスタマイズされている場合は、変数の初期化のために:set関数を使用し、それ以外は単にset-defaultを使用します。
custom-initialize-safe-setcustom-initialize-safe-defaultこれらのn関数はcustom-initialize-set、custom-initialize-defaultと同様に振る舞いますが、エラーをcatchします。初期化中にエラーが発生した場合は、set-defaultを使用して変数をnilにセットして、エラーをシグナルしません。
これらの関数は事前ロードされたファイルで定義されたオプションのためのものです(requireされた変数または関数がまだ定義されていないため、standard式はエラーをシグナルするかもしれない)。その値は通常、startup.elで更新され、defcustomにより計算された値は無視されます。startup後に、その値をunsetして、defcustomを再評価すれば、エラーなしでstandardは評価されます。
:risky valueその変数のrisky-local-variableプロパティーをvalueにセットします(File Local Variablesを参照してください)。
:safe functionその変数のsafe-local-variableプロパティーを、functionにセットします(File Local Variablesを参照してください)。
:set-after variables保存されたカスタマイズに合わせて変数をセッティングするときは、その前に変数variables確実にセット —
つまり、これら他のものが処理される後までセッティングを遅延 —
してください。これら他の変数が意図された値をもっていない場合に、この変数のセッティングが正しく機能しないときは、:set-afterを使用してください。
特定の機能を“オンに切り替える”オプションにたいしては、:requireキーワードを指定すると便利です。これは、その機能がまだロードされていないときは、そのオプションがセットされるとEmacsがその機能をロードするようにします。Common Item Keywordsを参照してください。以下はライブラリーsaveplace.elの例です:
(defcustom save-place nil "Non-nil means automatically save place in each file..." :type 'boolean :require 'saveplace :group 'save-place)
あるカスタマイズアイテムが、:optionsがサポートするhookやalistのような型をもつ場合は、custom-add-frequent-valueを呼び出すことにより、defcustom宣言の外部から、別途値を追加できます。たとえばemacs-lisp-mode-hookから呼び出されることを意図した関数my-lisp-mode-initializationを定義する場合は、emacs-lisp-mode-hookにたいする正当な値として、その定義を編集することなく、その関数をリストに追加したいと思うかもしれません。これは以下のようにして行うことができます:
(custom-add-frequent-value 'emacs-lisp-mode-hook 'my-lisp-mode-initialization)
カスタマイズオプションsymbolにたいして正当な値のリストにvalueを追加します。
追加による正確な効果は、symbolのカスタマイズ型に依存します。
内部的には、defcustomは、標準値にたいする式を記録するためにシンボルプロパティーstandard-valueを、カスタマイズバッファーでユーザーによりセットされたが保存されていない値を記録するためにsaved-valueを使用します。Symbol Propertiesを参照してください。これらのプロパティーは、carがその値を評価する式であるようなリストです。
この関数は、defcustomを通じて宣言されたユーザーオプションsymbolの標準値を再評価します。変数がカスタマイズされた場合、この関数はかわりに保存された値を再評価します。それからこの関数はユーザーオプションをその値に(もし定義されていればそのオプションの:setプロパティーを使用して)セットします。
これは値が正しく計算される前に定義されたカスタマイズ可能オプションにたいして有用です。たとえばstartupの間、Emacsは事前ロードされたEmacs Lispファイルで定義されたユーザーオプションにたいしてこの関数を呼び出しますが、これらの初期値は実行時だけ利用可能な情報に依存します。
この関数は、argがカスタマイズ可能変数の場合は、非nilをreturnします。カスタマイズ可能変数とは、standard-valueかcustom-autoloadプロパティーをもつ(通常はdefcustomで宣言されたことを意味する)変数、または別のカスタマイズ可能変数にたいするエイリアスのことです。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
defcustomでユーザーオプションを定義するときは、ユーザーオプションのカスタマイズ型(customization
type)を指定しなければなりません。これは、(1)値が適正か、(2)編集のためにカスタマイズバッファーで値を表示する方法、を記述するLispオブジェクトです。
カスタマイズ型は、defcustom内の:typeキーワードで指定します。:typeの引数は評価されますが、defcustomが実行されるとき1回だけ評価されるので、さまざまな値をとる場合には有用でありません。通常はクォートされた定数を使用します。たとえば:
(defcustom diff-command "diff" "The command to use to run diff." :type '(string) :group 'diff)
一般的に、カスタマイズ型は、最初の要素が以降のセクションで定義されるカスタマイズ型の1つであるような、リストです。このシンボルの後にいくつかの引数があり、それはそのシンボルに依存します。型シンボルと引数の間には、オプションでkeyword-valueペアー(Type Keywordsを参照してください)を記述できます。
いくつかの型シンボルは引数を使用しません。これらはシンプル型(simple
types)と呼ばれます。シンプル型にたいしては、keyword-valueペアーを使用しない場合は、型シンボルの周囲のカッコ(parentheses)を省略できます。たとえばカスタマイズ型として単にstringと記述すると、それは(string)と等価です。
すべてのカスタマイズ型はウィジェットとして実装されます。詳細は、Introduction in The Emacs Widget Libraryを参照してください。
| 14.4.1 Simple Types | シンプルなカスタマイズ型(sexp、integerなど)。 | |
| 14.4.2 Composite Types | 他の型やデータから新しい型を構築する。 | |
| 14.4.3 Splicing into Lists | :inlineで要素をリストに結合する。
| |
| 14.4.4 Type Keywords | カスタマイズ型でのキーワード/引数ペアー | |
| 14.4.5 Defining New Types | 型に名前をつける。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、すべてのシンプルデータ型を説明します。これらのカスタマイズ型のうちのいくつかにたいして、カスタマイズウィジェットはC-M-iまたはM-TABによる、インライン補完を提供します。
sexp値はプリントおよび読み込むことができる任意のLispオブジェクトです。より特化した型の使用するために時間をとりたくない場合は、任意のオプションへのフォールバックとしてsexpを使用することができます。
integer値は整数でなければなりません。
number値は数(浮動小数点数または整数)でなければなりません。
float値は浮動小数点数でなければなりません。
string値は文字列でなければなりません。カスタマイズバッファーはその文字列を区切り文字‘"’文字および‘\’クォートなしで表示します。
regexpstring文字と同様ですが、その文字列は有効な正規表現でなければなりません。
character値は文字コードでなければなりません。文字コードは実際には整数ですが、この型は数字を表示せずに、バッファー内にその文字を挿入することにより値を表示します。
file値はファイル名でなければなりません。ウィジェットは補完を提供します。
(file :must-match t)値は既存のファイル名でなければなりません。ウィジェットは補完を提供します。
directory値はディレクトリー名でなければなりません。ウィジェットは補完を提供します。
hook値は関数のリストでなければなりません。このカスタマイズ型はフック変数にたいして使用されます。フック内での使用を推奨される関数のリストを指定するために、フック変数のdefcustom内で:optionsキーワードを使用できます。Defining Customization Variablesを参照してください。
symbol値はシンボルでなければなりません。これはカスタマイズバッファー内でシンボル名として表示されます。ウィジェットは補完を提供します。
function値はラムダ式か関数名でなければなりません。ウィジェットは関数名にたいする補完を提供します。
variable値は変数名でなければなりません。ウィジェットは補完を提供します。
face値はフェイス名のシンボルでなければなりません。ウィジェットは補完を提供します。
boolean値は真偽値 —
nilかtです。choiceとconstを合わせて使用(次のセクションを参照)することにより、値がnilかtでなければならず、それぞれの値に固有の意味に適合する説明テキストを指定することもできます。
key-sequence値はキーシーケンスです。カスタマイズバッファーは、kbd関数と同じ構文うぃ使用して、キーシーケンスを表示します。Key Sequencesを参照してください。
coding-system値はコーディングシステム名でなければならず、M-TABで保管することができます。
color値は有効なカラー名でなければなりません。ウィジェットはカラー名にたいする補完と、同様に*Colors*バッファーに表示されるカラーサンプルとカラー名のリストからカラー名を選択するボタンを提供します。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
適切なシンプル型がないときは、複合型(composite types)を使うことができます。複合型は特定のデータによる他の型から、新しい型を構築します。指定された型またはデータは、その複合型の引数(argument)と呼ばれます。複合型は通常、以下のようなものです:
(constructor arguments…)
しかし、以下のように引数の前にkeyword-valueペアーを追加することもできます。
(constructor {keyword value}… arguments…)
以下のテーブルに、はコンストラクター(constructor)と、複合型を記述するためにそれらを使用する方法を示します:
(cons car-type cdr-type)値はコンスセルでなければならず、CARはcar-type、CDRはcdr-typeに適合していなければなりません。たとえば、(cons
string symbol)は、("foo" . foo)のような値にマッチするデータ型です。
カスタマイズバッファーでは、CARとCDRは、それぞれ特定のデータ型に応じて、別々に表示・編集されます。
(list element-types…)値は、element-typesで与えられる要素と数が正確に一致するリストでなければならず、リストの各要素はそれぞれ対応するelement-typeに適合しなければなりません。
たとえば、(list integer string
function)は、3つの要素のリストを示し、1つ目の要素は整数、2つ目の要素は文字列、3つ目の要素は関数です。
カスタマイズバッファーでは、各要素は、それぞれ特定のデータ型に応じて、別々に表示・編集されます。
(group element-types…)これはlistと似ていますが、Customバッファー内でのテキストのフォーマットが異なります。listは各要素の値を、そのタグでラベルづけしますが、groupはそれを行いません。
(vector element-types…)これはlistと似ていますが、リストではなくベクターでなければなりません。各要素はlistの場合と同様に機能します。
(alist :key-type key-type :value-type value-type)値はコンスセルのリストでなければならず、各セルのCARはカスタマイズ型key-typeのキーを表し、同じセルのCDRはカスタマイズ型value-typeの値を表します。ユーザーはkey/valueペアーの追加や削除ができ、各ペアのキーと値の両方を編集することができます。
省略された場合、key-typeとvalue-typeのデフォルトは、sexpです。
ユーザーは指定されたkey-typeにマッチする任意のキーを追加できますが、:options(Defining Customization Variablesを参照してください)で指定することにより、あるキーを優先的に扱うことができます。指定されたキーは、(適切な値とともに)常にカスタマイズバッファーに表示されます。また、alistにkey/valueを含める、除外する、または無効にするかを指定するチェックボックスも一緒に表示されます。ユーザーは:optionsキーワード引数により指定された値は、変更できません。
:optionsキーワードにたいする引数は、alist内の適切なキーにたいする仕様のリストであるべきです。これらは通常、単純なアトムであり、それらは自身をを意味します。たとえば:
:options '("foo" "bar" "baz")
これは、名前が"foo"、"bar"、"baz"の、3つの“既知”のキーがあることを指定し、それらは常に最初に表示されます。
たとえば"bar"キーに対応する値を整数だけにするというように、特定のキーに対して値の型を制限したいときがあるかもしれません。これはリスト内でアトムのかわりにリストを使用することにより、指定することができます。前述のように、1つ目の要素はそのキーを指定し、2つ目の要素は値の型を指定します。たとえば:
:options '("foo" ("bar" integer) "baz")
最後に、キーが表示される方法を変更したいときもあるかもしれません。デフォルトでは、:optionsキーワードで指定された特別なキーはユーザーが変更できないので、キーは単にconstとして表示されます。しかし、たとえばそれが関数バインディングをもつシンボルだと知っている場合はfunction-itemといったように、あるキーの表示のために、より特化した型を使用したいと思うかもしれません。これは、キーに対してシンボルを使うかわりに、カスタマイズ型指定を使用することにより、行うことができます。
:options '("foo"
((function-item some-function) integer)
"baz")
多くのalistは、コンスセルのかわりに2要素のリストを使用します。たとえば、
(defcustom cons-alist
'(("foo" . 1) ("bar" . 2) ("baz" . 3))
"Each element is a cons-cell (KEY . VALUE).")
のかわりに以下を使用します
(defcustom list-alist
'(("foo" 1) ("bar" 2) ("baz" 3))
"Each element is a list of the form (KEY VALUE).")
リストはコンスセルの最上位に実装されているため、上記のlist-alistを、コンスセルのalist(value-typeが実際の値を含む1要素のリストであるような)として扱うことができます。
(defcustom list-alist '(("foo" 1) ("bar" 2) ("baz" 3))
"Each element is a list of the form (KEY VALUE)."
:type '(alist :value-type (group integer)))
listのかわりにgroupを使用するのは、その目的に適したフォーマットのためだけです。
同様に、以下のようなトリックの類を用いることにより、より多くの値が各キー連づけられたalistを得ることができます:
(defcustom person-data '(("brian" 50 t)
("dorith" 55 nil)
("ken" 52 t))
"Alist of basic info about people.
Each element has the form (NAME AGE MALE-FLAG)."
:type '(alist :value-type (group integer boolean)))
(plist :key-type key-type :value-type value-type)このカスタマイズ型はalist(上位参照)と似ていますが、(1)情報がプロパティーリスト(Property Listsを参照してください)に格納され、(2)key-typeが省略された場合、デフォルトはsexpではなく、symbolになります。
(choice alternative-types…)値はalternative-typesのうちの1つに適合しなければなりません。たとえば、(choice integer
string)では整数か文字列が許されます。
カスタマイズバッファーでは、ユーザーはメニューを使用して候補を選択して、それらの候補にたいして通常の方法で値を編集できます。
通常この選択からメニューの文字列が自動的に決定されます。しかし候補の中に:tagキーワードを含めることにより、メニューにたいして異なる文字列を指定できます。たとえば、空白の数を意味する整数と、その通りに使用したいテキストにたいする文字列の場合は、以下のような方法でカスタマイズ型を記述したいかもしれません
(choice (integer :tag "Number of spaces")
(string :tag "Literal text"))
この場合メニューは、‘Number of spaces’と‘Literal text’を提示します。
const以外のnilが有効な値ではない候補には、:valueキーワードを使用して、有効なデフォルト値を指定するべきです。Type Keywordsを参照してください。
複数の候補によりいくつかの値が提供される場合、カスタマイズは適合する値をもつ最初の候補を選択します。これは常に、もっとも特有な型を最初に、もっとも一般的な型を最後にリストすべきことを意味します。以下は適切な使い方の例です:
(choice (const :tag "Off" nil)
symbol (sexp :tag "Other"))
この使い方では、特別な値nilはその他のシンボルとは別に扱われ、シンボルは他のLisp式とは別に扱われます。
(radio element-types…)これはchoiceと似ていますが、選択はメニューではなく、‘ラジオボタン’で表示されます。これは該当する選択にたいしてドキュメントが表示できる利点があるので、関数定数(function-itemカスタマイズ型)の選択に適す場合があります。
(const value)値はvalueでなければならず、他は許されません。
constは主にchoiceの中で使用されます。たとえば、(choice integer (const
nil))では、整数かnilが選択できます。
choiceの中では、:tagとともにconstが使用される場合があります。たとえば、
(choice (const :tag "Yes" t)
(const :tag "No" nil)
(const :tag "Ask" foo))
これはtがyes、nilがno、fooが“ask”を意味することを示します。
(other value)この候補は任意のLisp値にマッチできますが、ユーザーがこの候補を選択した場合は、値valueが選択されます。
otherは主にchoiceの最後の要素に使用されます。たとえば、
(choice (const :tag "Yes" t)
(const :tag "No" nil)
(other :tag "Ask" foo))
これはtがyes、nilがno、それ以外は“ask”を意味することを示します。ユーザーが候補メニューから‘Ask’を選択した場合は、値fooが指定されます。しかし、その他の値(t、nil、fooを除く)では、fooと同様に‘Ask’が表示されます。
(function-item function)constと同様ですが、値が関数のときに使用されます。これはドキュメント文字列も関数名と同じように表示します。ドキュメント文字列は、:docで指定した文字列か、function自身のドキュメント文字列です。
(variable-item variable)constと同様ですが、値が変数名のときに使用されます。これはドキュメント文字列も変数名と同じように表示します。ドキュメント文字列は、:docで指定した文字列か、variable自身のドキュメント文字列です。
(set types…)値はリストでなければならず、指定されたtypesの1つにマッチしなければなりません。
これはカスタマイズバッファーではチェックリストとして表示されるので、typesはそれぞれ対応する要素を1つ、あるいは要素をもちません。同じ1つのtypesにマッチするような、異なる2つの要素を指定することはできません。たとえば、(set
integer
symbol)は、リスト内で1つの整数、および/または1つのシンボルが許され、複数の整数や複数のシンボルは許されません。結果として、set内でintegerのような特定的ではない型を使用するのは稀です。
以下のように、const型はset内のtypesでよく使用されます:
(set (const :bold) (const :italic))
alist内で利用できる要素を示すために使用されることもあります:
(set (cons :tag "Height" (const height) integer)
(cons :tag "Width" (const width) integer))
これによりユーザーにオプションでheightとwidthの値を指定させることができます。
(repeat element-type)値はリストでなければならず、リストの各要素は型element-typeに適合しなければなりません。カスタマイズバッファーでは要素のリストとして表示され、‘[INS]’および‘[DEL]’ボタンにより、要素の追加や削除が行われます。
(restricted-sexp :match-alternatives criteria)これはもっとも汎用的な複合型の構築方法です。値はcriteriaを満足する任意のLispオブジェクトです。criteriaはリストで、リストの各要素は以下のうちの1つを満たす必要があります:
nilか非nilのどちらかをリターンする関数。リスト内での述語の使用により、その述語が非nilをリターンするようなオブジェクトが許されることを意味する。
'object。リスト内でこの要素は、object自身が容認される値であることを示す。
たとえば、
(restricted-sexp :match-alternatives
(integerp 't 'nil))
これは整数、t、nilを正当な値として受け入れます。
カスタマイズバッファーは適切な値をそれらの入力構文ですべて表示し、ユーザーはこれらをテキストとして編集できます。
以下は複合型でキーワード/値ペアーとして使用できるキーワードのテーブルです:
:tag tagtagは、ユーザーとのコミュニケーションのために、その候補の名前として使用される。choice内に出現する型にたいして有用。
:match-alternatives criteriacriteriaは可能な値とのマッチに使用されます。restricted-sexp内でのみ有用です。
:args argument-list型構築の引数としてargument-listの要素を使用します。たとえば、(const :args
(foo))は(const
foo)と等価です。明示的に:argsとく記述する必要があるのは稀です。なぜなら、最後のキーワード/値ペアーの後に続くものは何であれ、引数として認識されるからです。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
:inline機能により、可変個の要素を、カスタマイズ型のlistやvectorの途中にスプライス(splice:
継ぎ足す)することができます。listやvector記述を含む型にたいして:inline
tを追加することによりこれを使用します。
通常listやvector型の仕様は、単一の要素型を表します。しかしエントリーが:inline
tを含む場合、マッチする値は、その含まれたシーケンスに直接マージされます。たとえば、エントリーが3要素のリストにマッチする場合、全体が3要素のシーケンスになります。これはバッククォート構文(Backquoteを参照)の‘,@’に類似しています。
たとえば、最初の要素がbazで、残りの引数は0個以上のfooかbarでなければならないリストを指定する場合は、以下のカスタマイズ型を使用します:
(list (const baz) (set :inline t (const foo) (const bar)))
これは (baz)、(baz foo)、(baz bar)、(baz foo
bar)のような値にマッチします。
要素の型がchoiceの場合は、choice自身の中で:inlineを使用せずに、choiceの候補(の一部)の中で使用します。たとえば、最初がファイル名で開始され、その後にシンボルtか2つの文字列を続けなければならないリストにマッチさせるには、以下のカスタマイズ型を使用します:
(list file
(choice (const t)
(list :inline t string string)))
選択においてユーザーが選択肢の1つ目を選んだ場合、リスト全体が2つの要素をもち、2つ目の要素はtになります。ユーザーが2つ目の候補を選んだ場合、リスト全体が3つの要素をもち、2つ目と3つ目の要素は文字列でなければなりません。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
カスタマイズ型内の型名シンボルの後にキーワード/引数ペアーを指定できます。以下は使用できるキーワードと、それらの意味です:
:value defaultデフォルト値を提供する。
その候補にたいしてnilが有効な値でない場合は、:valueに有効なデフォルトを指定することが必須になります。
choiceの内部の候補として出現する型にたいしてこれを使用する場合、ユーザーがカスタマイズバッファー内のメニューによりこの候補を選択したときに、使用するデフォルト値を最初に指定します。
もちろんオプションの実際の値がこの候補に適合する場合は、defaultではなく実際の値が表示されます。
:format format-stringこの文字列は、その型に対応する値を説明するために、バッファーに挿入されます。format-string内では、以下の‘%’エスケープが利用できます:
ボタンとしてマークされたテキストbuttonを表示する。:action属性は、ユーザーがそれを呼び出したときに、そのボタンが何を行うか指定する。この属性の値は2つの引数
— ボタンが表示されるのでウィジェットとイベント — をとる関数。
異なるアクションを行う2つの異なるボタンを指定する方法はない。
:sample-faceにより指定された、スペシャルフェイス内のsampleを表示する。
そのアイテムの値を代替えする。その値がどのように表示されるかはアイテムの種類と、(カスタマイズ型にたいしては)カスタマイズ型にに依存する。
そのアイテムのドキュメント文字列を代替えする。
‘%d’と同様ふぁが、ドキュメント文字列が複数行の場合に、ドキュメント文字列全体か最初の行だけかを制御するボタンを追加する。
その位置でタグに置き換える。:tagキーワードでタグを指定する。
リテラル‘%’を表示する。
:action actionユーザーがボタンをクリックした場合はactionを実行します。
:button-face face‘%[…%]’で表示されたボタンテキストにたいして、フェイスface(フェイス名、またはフェイス名のリスト)を使用します。
:button-prefix prefix:button-suffix suffixこれらはボタンの前、または後に表示されるテキストを指定します。以下が指定できます:
nilテキストは挿入されない。
その文字列がリテラルに挿入される。
そのシンボルの値が使用される。
:tag tagこの型に対応する値(または値の一部)にたいするタグとしてtag(文字列)を使用する。
:doc docこの型に対応する値(または値の一部)にたいするドキュメント文字列としてdocを使用する。これが機能するためには、:formatにたいする値を指定し、その値にたいして‘%d’か‘%h’を使用しなければならない。
ある型にたいしてドキュメント文字列を指定するのは、:choice内の候補の型や、他の複合型の一部について情報を提供するのが通常の理由である。
:help-echo motion-docwidget-forwardやwidget-backwardでこのアイテムに移動したときに、エコーエリアに文字列motion-docを表示する。さらに、マウスのhelp-echo文字列としてmotion-docが使用され、これは実際にはヘルプ文字列を生成するために評価される関数またはフォームかもしれない。もし関数の場合、これは1つの引数(そのウィジェット)で呼び出される。
:match function値がその型にマッチするか判断する方法を指定する。対応する値functionは、2つの引数(ウィジェットと値)をとる関数で、値が適切なら非nilをリターンすること。
:validate function入力にたいして検証を行う関数を指定する。functionは引数としてウィジェットをとり、そのウィジェットのカレント値がウィジェットにたいして有効ならnilをリターンすること。それ以外は無効なデータを含むウィジェットをリターンして、そのウィジェットの:errorプロパティに、そのエラーを説明する文字列をセットすること。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
前のセクションでは、defcustomにたいして型の詳細な仕様を作成する方法を説明しました。そのような型仕様に名前を与えたい場合があるかもしれません。理解しやすいケースとしては、多くのユーザーオプションに同じ型を使用する場合などです。各オプションにたいして仕様を繰り返すより、その型に名前を与えて、defcustomそれぞれにその名前を使用することができます。他にもユーザーオプションの値が再帰的なデータ構造のケースがあります。あるデータ型がそれ自身を参照できるようにするためには、それが名前をもつ必要があります。
カスタマイズ型はウィジェットとして実装されているめ、新しいカスタマイズ型を定義するには、新たにウィジェット型を定義します。ここではウィジェットインターフェイスの詳細は説明しません。Introduction in The Emacs Widget Libraryを参照してください。 かわりに、シンプルな例を用いて、カスタマイズ型を新たに定義するのに必要となる、最小限の機能について説明します。
(define-widget 'binary-tree-of-string 'lazy
"A binary tree made of cons-cells and strings."
:offset 4
:tag "Node"
:type '(choice (string :tag "Leaf" :value "")
(cons :tag "Interior"
:value ("" . "")
binary-tree-of-string
binary-tree-of-string)))
(defcustom foo-bar ""
"Sample variable holding a binary tree of strings."
:type 'binary-tree-of-string)
新しいウィジェットを定義するための関数は、define-widgetと呼ばれます。1つ目の引数は、新たなウィジェット型にしたいシンボルです。2つ目の引数は既存のウィジェットを表すシンボルで、新しいウィジェットではこの既存のウィジェットと異なる部分を定義することになります。新たなカスタマイズ型を定義する目的にたいしては、lazyウィジェットが最適です。なぜならこれは、defcustomにたいするキーワード引数と同じ構文、同じ名前でキーワード引数:typeを受け取るからです。3つ目の引数は、新しいウィジェットにたいするドキュメント文字列です。この文字列は、M-x
widget-browse RET binary-tree-of-string
RETコマンドで参照することができるようになります。
これらの必須の引数の後にキーワード引数が続きます。もっとも重要なのは:typeで、これはこのウィジェットにマッチさせたいデータ型を表します。上記の例ではbinary-tree-of-stringは文字列、またはcarとcdrがbinary-tree-of-stringであるようなコンスセルです。この定義中でのウィジェット型への参照に注意してください。:tag属性はユーザーインターフェイスでウィジェット名となる文字列、:offset引数はカスタマイズバッファーでのツリー構造の外観で,子ノードと関連する親ノードの間に4つのスペースを確保します。
defcustomは、通常のカスタマイズ型に使用される方法で新しいウィジェットを表示します。
lazyという名前の由来は、他のウィジェットの場合、それらがバッファーでインスタンス化されるとき、他の合成されたウィジェットが下位のウィジェットを内部形式に変換するからです。この変換は再帰的なので、下位のウィジェットは、それら自身の下位ウィジェットへと変換されます。データ構造自体が再帰的な場合、この変換は無限再帰(infinite
recursion)となります。lazyウィジェットは、:type引数を必要なときだけ変換することにより、この再帰を防ぎます。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下の関数には、変数とフェイスにたいして、そのユーザーのカスタマイズ設定をインストールる役目があります。それらの関数は、ユーザーがカスタマイズインターフェイスで‘Save
for future
sessions’を呼び出したときに、次回のEmacs起動時に評価されるようにcustom-set-variablesフォーム、および/またはcustom-set-facesフォームを
がカスタムファイルに書き込まれることによって効果をもちます。
この関数はargsにより指定された変数のカスタマイズをインストールします。args内の引数はそれぞれ、以下のようなフォームです
(var expression [now [request [comment]]])
varは変数名(シンボル)、expressionはカスタマイズされた値に評価される式です。
このcustom-set-variables呼び出しより前にvarにたいしてdefcustomフォームが評価された場合は、即座にexpressionが評価され、その変数の値にその結果がセットされます。それ以外は、その変数のsaved-valueプロパティにexpressionが格納され、これに関係するdefcustomが呼び出されたとき(通常はその変数を定義するライブラリーがEmacsにロードされたとき)に評価されます。
now、request、commentエントリーは内部的な使用に限られており、省略されるかもしれません。nowは、もし非nilの場合には、たとえその変数のdefcustomフォームが評価されていなくても、その変数の値がそのときセットされます。requestは即座にロードされる機能のリストです(Featuresを参照)。commentはそのカスタマイズを説明する文字列です。
この関数はargsにより指定されたフェイスのカスタマイズをインストールします。args内の引数はそれぞれ、以下のようなフォームです
(face spec [now [comment]])
faceはフェイス名(シンボル)、specはそのフェイスにたいするカスタマイズされたフェイス仕様です(Defining Facesを参照)。
now、request、commentエントリーは内部的な使用に限られており、省略されるかもしれません。nowは、もし非nilの場合には、たとえdeffaceフォームが評価されていなくても、そのフェイス仕様がそのときセットされます。commentはそのカスタマイズを説明する文字列です。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
カスタムテーマ(Custom themes)とはユニットとして有効または無効にできるセッティングのコレクションです。Custom Themes in The GNU Emacs Manualを参照してくださいカスタムテーマはそれぞれEmacs Lispソースファイルにより定義され、それらはこのセクションで説明する慣習にしたがう必要があります。(カスタムファイルを手で記述するかわりに、カスタマイズ風のインターフェイスを使用して作成することもできます。Creating Custom Themes in The GNU Emacs Manualを参照してください。)
カスタムファイルはfoo-theme.elのように命名すべきです。ここでfooはテーマの名前です。このファイルでの最初のLispフォームはdefthemeの呼び出しで、最後のフォームはprovide-themeにすべきです。
このマクロはカスタムテーマの名前としてtheme(シンボル)を宣言します。オプション引数docは、そのテーマを説明する文字列であるべきです。この文字列はユーザーがdescribe-themeコマンドを呼び出したり、‘*Custom
Themes*’バッファーで?をタイプしたときに表示されます。
2つの特別なテーマ名は禁止されています(それらを使用するとエラーになります)。userは、そのユーザーの直接的なカスタマイズ設定を格納するための“ダミー”のテーマです。そしchangedはカスタムシステムの外で行われた変更を格納するための“ダミー”のテーマです。
このマクロは完全に仕様が定められたテーマ名themeを宣言します。
defthemeとprovide-themeの違いは、そのテーマセッティングを規定するLispフォーム(通常はcustom-theme-set-variablesの呼び出し、および/またはcustom-theme-set-facesの呼び出し)です。
この関数は、カスタムテーマthemeの変数のセッティングを規定します。themeはシンボルです。args内の各引数はフォームのリストです。
(var expression [now [request [comment]]])
ここでリストエントリーはcustom-set-variablesのときと同じ意味をもちます。Applying Customizationsを参照してください。
この関数は、カスタムテーマthemeのフェイスのセッティングを規定します。themeはシンボルです。args内の各引数はフォームのリストです。
(face spec [now [comment]])
ここでリストエントリーはcustom-set-facesのときと同じ意味をもちます。Applying Customizationsを参照してください。
原則的に、テーマファイルは他のLispフォームを含むこともでき、それらはそのテーマがロードされるときに評価されるでしょうが、これは“悪いフォーム”です。悪意のあるコードを含むテーマのロードを防ぐために、最初に非ビルトインテーマをロードする前に、Emacsはソースファイルを表示して、ユーザーにたいして確認を求めます。
以下の関数は、テーマをプログラム的に有効または無効にするのに有用です:
この関数はtheme(シンボル)がカスタムテーマの名前の場合(たとえば、そのテーマが有効かどうかにかかわらず、カスタムテーマがEmacsにロードされていれば)、非nilをリターンします。それ以外はnilをリターンします。
この変数の値は、Emacsにロードされたテーマのリストです。テーマはそれぞれ、Lispシンボル(テーマ名)により表されます。この変数のデフォルト値は、2つの“ダミーテーマ”を含みます:
(user
changed)。changedテーマには、カスタムテーマが適用される前に行われたセッティング(たとえばカスタムの外部での変数のセット)が格納されています。userテーマには、そのユーザーがカスタマイズして保存したセッティングが格納されています。defthemeマクロで宣言された任意の追加テーマは、このリストの先頭に追加されます。
この関数はthemeという名前のカスタムテーマを、変数custom-theme-load-pathで指定されたディレクトリーを探して、ソースファイルからロードします。Custom
Themes in The GNU Emacs
Manualを参照してください。また、そのテーマの変数とフェイスのセッティングが効果を及ぼすようにテーマをenablesにします(オプション引数no-enableが非nilでない場合)さらに、オプション引数no-confirmが非nilでない場合は、そのテーマをロードする前にユーザーに確認を求めます。
この関数はthemeという名前のカスタムテーマを有効にします。そのようなテーマがロードされていない場合は、エラーをシグナルします。
この関数はthemeという名前のカスタムテーマを無効にします。テーマはロードされたまま残りので、続けてenable-themeを呼び出せばテーマは再び有効になります。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lispコードのファイルをロードすることは、その内容をLispオブジェクト形式でLisp環境に取り込むことを意味します。Emacsはファイルを探してオープンし、テキストを読み込んで各フォームを評価してから、そのファイルをクローズします。そのようなファイルはLispライブラリー(Lisp library)とも呼ばれます。
eval-buffer関数がバッファー内のすべての式を評価するのと同様に、load関数はファイル内のすべての式を評価します。異なるのはEmacsバッファー内のテキストではなく、load関数はディスク上で見つかったファイル内のテキストを読み込み、評価することです。
ロードされたファイルは、ソースコードかバイトコンパイルされたコードとしてLisp式を含んでいなければなりません。このファイル内の各フォームは、トップレベルフォーム(top-level form)と呼ばれます。ロード可能なファイル内のフォームにたいする特別なフォーマットはありません。ファイル内のフォームはどれも、同じように直接バッファーにタイプされ、そこで評価されるでしょう(実際、ほとんどのコードはこの方法でテストされます)。多くの場合、そのフォームは関数定義と変数定義です。
外部ライブラリーのオンデマンドローディングについては、Dynamically Loaded Librariesを参照してください。
| 15.1 How Programs Do Loading | load関数、その他。
| |
| 15.2 Load Suffixes | loadが試みられるサフィックスについての詳細。
| |
| 15.3 Library Search | ロードするライブラリーの検索。 | |
| 15.4 Loading Non-ASCII Characters | Emacs Lispファイル内の非ASCII文字。 | |
| 15.5 Autoload | オートロードのための関数のセットアップ。 | |
| 15.6 Repeated Loading | ファイルを2度ロードする場合の配慮。 | |
| 15.7 Features | まだロードされていないライブラリーのロード。 | |
| 15.8 Which File Defined a Certain Symbol | 特定のシンボルがどのファイルで定義されているかの検索。 | |
| 15.9 Unloading | ロードされたライブラリーを"unload"する方法。 | |
| 15.10 Hooks for Loading | 特定のライブラリーがロードされたとき実行されるコードの提供。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs
Lispにはロードのためのインターフェイスがいくつかあります。たとえば、autoloadはファイル内で定義された関数にたいしてプレースホルダーとなるオブジェクトを作成します。この関数はオートロードされる関数を呼び出すために、ファイルからその関数の実際の定義の取得を試みます(Autoloadを参照)。requireは、ファイルがまだロードされていない場合にファイルをロードします(Featuresを参照)。これらすべての関数は、処理を行うために最終的にloadを呼び出します。
この関数はLispコードのファイルを見つけてオープンし、その中のすべてのフォームを評価して、そのファイルをクローズします。
ファイルを見つけるために、まずloadはfilename.elcという名前、つまりfilenameに拡張子‘.elc’を足した名前のファイルを探します。このようなファイルが存在したら、それをロードします。その名前のファイルが存在しない場合、loadはfilename.elという名前のファイルを探します。このファイルが存在したら、それをロードします。最後に、もしこれらの名前がどちらも見つからなかった場合、loadは何も付け足さないfilenameという名前のファイルを探して、それが存在したらロードします。(load関数にfilenameを認識する賢さはありません。foo.el.elのような正しくない名前のファイルの場合も、(load
"foo.el")の評価によりそれを見つけてしまいます。)
Auto
Compressionモードが有効(残念ながらデフォルトでは有効ですが)の場合、loadは他のファイル名を試みる前に圧縮されたバージョンのファイル名を探すので、ファイルを見つけることができません。圧縮されたファイルが存在したら、それを解凍してロードします。loadはファイル名にjka-compr-load-suffixes内の各サフィックスを足して、圧縮されたバージョンを探します。この変数の値は、文字列のリストでなければなりません。標準的な値は(".gz")です。
オプション引数nosuffixが非nilの場合loadはサフィックス‘.elc’と‘.el’を試みません。この場合、ロードしたいファイルの正確な名前を指定しなければなりません。ただしAuto
Compressionモードが有効な場合には、loadは圧縮されたバージョンを探すために、jka-compr-load-suffixesを使用します。正確なファイル名の指定と、、nosuffixにたいしてtを使用することにより、foo.el.elのような名前のファイルにたいするロードの試みを抑止できます。
オプション引数must-suffixが非nilの場合、loadはロードに使用されるファイルの名前に明示的にディレクトリー名が含まれていなければ、ファイル名が‘.el’か‘.elc’で終わること(あるいは圧縮による拡張子が付加されているかもしれません)を要求します。
オプションload-prefer-newerが非nilの場合、loadはサフィックスを検索するとき、どのファイルであっても(‘.elc’、‘.el’など)、もっとも最近変更されたファイルのバージョンを選択します。
filenameがfooやbaz/foo.barのような相対ファイル名の場合、loadは変数load-pathを使用してそのファイルを探します。これはload-path内にリストされた各ディレクトリーにfilenameを追加して、最初に見つかったら名前のマッチするファイルをロードします。デフォルトディレクトリーを意味するnilがload-pathで措定されたときだけ、カレントデフォルトディレクトリーを試みます。loadはload-path内の最初のディレクトリーで利用可能な3つのサフィックスすべてを試行してから、2つ目のディレクトリーで3つのサフィックスすべてを試行する、というようにファイルを探します。Library Searchを参照してください。
最終的に見つかったファイル、およびEmacsがそのファイルを見つけたディレクトリーが何であれ、Emacsはそのファイル名を変数load-file-nameの値にセットします。
foo.elcがfoo.elより古いと警告された場合、それはfoo.elのリコンパイルを考慮すべきことを意味します。Byte Compilationを参照してください
(コンパイルされていない)ソースファイルをロードしたとき、Emacsがファイルをvisitしたときと同じようにloadは文字セットの変換を行います。Coding Systemsを参照してください。
コンパイルされていないファイルをロードするとき、Emacsはそのファイルに含まれる任意のマクロ(Macrosを参照)を展開します。わたしたちはこれをeagerマクロ展開(eager macro expansion)と呼んでいます。(関連するコードを実行するまで展開を延期するのではなく)これを行うことにより、コンパイルされていないコード実行のスピードが明らかに向上します。このマクロ展開は、循環参照により行うことができないときもあります。これの一番簡単な例は、ロードしようとしているファイルが他のファイルで定義されているマクロを参照しているが、そのファイルはロードしようとしているファイルを必要としている場合です。これは一般的には無害です。Emacsは問題の詳細を与えるために警告(‘Eager macro-expansion skipped due to cycle…’)をプリントしますが、単にその時点ではマクロを展開せずに、そのファイルはロードされます。あなたはこの問題が発生しないように、コードをリストラクチャーしたいと思うかもしれません。コンパイル済みファイルでは、マクロ展開はコンパイル時に行われるので、ロード時のマクロ展開は行われません。Macros and Byte Compilationを参照してください。
nomessageが非nilでない場合は、ロードの間、エコーエリアに‘Loading
foo...’や‘Loading foo...done’のようなメッセージが表示されます。
ファイルをロードする間のハンドルされないエラーは、ロードを終了させます。autoloadのためのロードの場合、ロードの間に定義された任意の関数定義は元に戻されます。
loadがロードするファイルを見つけられなかった場合、通常は(‘Cannot open load file
filename’のメッセージとともに)エラーfile-errorがシグナルされます。しかしmissing-okが非nilの場合、loadは単にnilをリターンします。
式の読み取りにたいしてloadがreadのかわりに使用する関数を指定するために、変数load-read-functionを使用できます。以下を参照してください。
ファイルが正常にロードされた場合、loadはtをリターンします。
このコマンドは、ファイルfilenameをロードします。filenameが相対ファイル名の場合は、カレントデフォルトディレクトリーとみなされます。このコマンドは、load-pathを使用せず、サフィックスの追加もしません。しかし、(Auto
Compressionモードが有効な場合は)圧縮されたバージョンの検索を行います。ロードするファイル名を正確に指定したい場合は、このコマンドを使用してください。
このコマンドはlibraryという名前のライブラリーをロードします。このコマンドは、引数を読み取る方法がインタラクティブであることを除き、loadと同じです。Lisp
Libraries in The GNU Emacs Manualを参照してください。
この変数は、Emacsがファイルをロード中のときは非nil、それ以外はnilです。
このセクションの最初に説明した検索でEmacsがファイルを見つけて、そのファイルをロード中のとき、この変数の値はそのファイルの名前です。
この変数は、loadとeval-regionが式の読み取るために、readのかわりに使用する関数を指定します。指定する関数はreadと同様、引数が1つの関数です。
通常、この変数の値はnilで、これはそれらの関数がreadを使用すべきことを意味します。
この変数を使用するかわりに、別の新たな方法を使用するほうが明確です。eval-regionのread-function引数に、その関数を渡す方法です。Evalを参照してください。
Emacsのビルドでloadがどのように使用されているかについての情報は、Building Emacsを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ここでは、loadが試行するサフィックスについて、技術的な詳細を説明します。
これは(ソースまたはコンパイル済みの)Emacs
Lispファイルを示すサフィックスのリストです。空の文字列が含まれるべきではありません。loadは、指定されたファイル名にLispファイルのサフィックスを追加するときに、これらのサフィックスを使用します。標準的な値は(".elc"
".el")で、これは前のセクションで説明した振る舞いとなります。
これは同じファイルにたいする異なる表現を示すサフィックスのリストです。このリストは空の文字列から開始されるべきです。loadはファイルを検索するときは、他のファイルを検索する前にこのリストのサフィックスを順番にファイル名に追加します。
Auto
Compressionモードを有効にすることによりjka-compr-load-suffixesのサフィックスがこのリストに追加され、無効にすると再びリストから取り除かれます。load-file-rep-suffixesの標準的な値は、Auto
Compressionモードが無効な場合は("")です。jka-compr-load-suffixesの標準的な値が(".gz")であることを考慮すると、Auto
Compressionモードが有効な場合のload-file-rep-suffixesの標準的な値は(""
".gz")です。
この関数は、must-suffix引数が非nilのときは、loadが試みるべきすべてのサフィックスを順番にしたがったリストでリターンします。この関数はload-suffixesとload-file-rep-suffixesの両方を考慮に入れます。load-suffixes、jka-compr-load-suffixes、load-file-rep-suffixesがすべて標準的な値の場合、この関数はAuto
Compressionモードが有効なら(".elc" ".elc.gz" ".el"
".el.gz")、無効なら(".elc" ".el")をリターンします。
まとめると、loadは通常まず(get-load-suffixes)の値のサフィックスを試み、つぎにload-file-rep-suffixesを試みます。nosuffixが非nilの場合は前者がスキップされ、must-suffixが非nilの場合は後者がスキップされます。
このオプションが非nilの場合は、ファイルが見つかった最初のサフィックスで停止せずに、loadはすべてのサフィックスをテストして、一番新しいファイルを使用します。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
EmacsがLispライブラリーをロードするときは、変数load-path.<により指定されるディレクトリー内のライブラリーを検索します。
この変数の値は、loadでファイルをロードするとき検索するディレクトリーのリストです。リストの各要素は文字列(ディレクトリー名でなければなりません)、またはnil(カレントワーキングディレクトリーを意味します)です。
Emacsは起動時にいくつかのステップによりload-pathの値をセットアップします。最初に、Emacsがコンパイルされたときのデフォルトロケーションセット(default
locations set)を使用して、load-pathを初期化します。通常これは以下のようなディレクトリーです
"/usr/local/share/emacs/version/lisp"
(以下の例では、あなたがインストールしたEmacsのインストールプレフィクスに合うように/usr/localを置き換えてください。)これらのディレクトリーには、Emacsとともにインストールされた、標準的なLispファイルが含まれます。Emacsがこれらを見つけられない場合は、正常に起動しないでしょう。
Emacsをビルドしたディレクトリーから起動した場合 −−− つまり正式にインストールされた実行形式ではないEmacsを起動した場合
— 、Emacsはビルドされたディレクトリーのソースのlispディレクトリーを使用してload-pathを初期化します。ソースとは別のディレクトリーでEmacsをビルドした場合は、ビルドしたディレクトリーのlispディレクトリーも追加します。(どちらの場合も、要素は絶対ファイル名になります。)
--no-site-lispオプションでEmacsを起動した場合を除き、load-pathの先頭に2つのさらにsite-lispを追加します。これらはローカルにインストールされたLispファイで、通常は:
"/usr/local/share/emacs/version/site-lisp"
と
"/usr/local/share/emacs/site-lisp"
の形式です。1つ目は特定のバージョンのEmacsにたいしてローカルにインストールされたものです。2つ目はインストールされたすべてのバージョンのEmacsが使用することを意図してローカルにインストールされたものです。(インストールされたものでないEmacsが実行された場合は、もし存在すればソースディレクトリーとビルドディレクトリーのsite-lispディレクトリーも追加します。これらのディレクトリーは通常、site-lispディレクトリーを含みません。)
環境変数EMACSLOADPATHがセットされている場合は、上述の初期化プロセスが変更されます。Emacsは、この環境変数の値にもとづいてload-pathを初期化します。
EMACSLOADPATHの構文は、PATHで使用される構文と同様です。ディレクトリー名は‘:’(オペレーティングシステムによっては‘;’)で区切られます。
以下は、(shスタイルのシェルから)EMACSLOADPATH変数をセットする例です:
export EMACSLOADPATH=/home/foo/.emacs.d/lisp:
環境変数の値内の空の要素は、(上記例のような)末尾、先頭、中間にあるかに関わらず、標準の初期化処理により決定されるload-pathのデフォルト値に置き換えられます。そのような空要素が存在しない場合には、EMACSLOADPATHによりload-path全体が指定されます。空要素、または標準のLispファイルを含むディレクトリーへの明示的なパスのどちらかを含めなければなりません。さもないとEmacsが関数を見つけられなくなります。(load-pathを変更する他の方法は、Emacs起動時にコマンドラインオプション-Lを使用する方法です。以下参照。)
load-path内の各ディレクトリーにたいし、Emacsはそのディレクトリーがファイルsubdirs.elを含むか確認し、もしあればそれをロードします。subdirs.elファイルは、load-pathのディレクトリーみたいして任意のサブディレクトリーを追加するためのコードが含まれており、Emacsがビルド/インストールされたとき作成されます。サブディレクトリーと複数階層下のレベルのサブディレクトリーの両方が、直接追加されます。ただし、名前の最初が英数字でないディレクトリー、名前がRCSまたはCVSのディレクトリー、名前が.nosearchというファイルを含むディレクトリーは除外されます。
Emacsは次に、コマンドラインオプション-L(Action Arguments in The GNU Emacs Manualを参照)で指定したロードディレクトリーを追加します。もしあれば、オプションパッケージ(Packaging Basicsを参照)がインストールされた場所も追加します。
initファイル(The Init Fileを参照)で、load-pathに1つ以上のディレクトリーを追加するコードを記述するのは一般的に行なわれています。たとえば:
(push "~/.emacs.d/lisp" load-path)
Emacsのダンプには、load-pathの特別な値を使用します。ダンプされたEmacsをカスタマイズするためにsite-load.elまたはsite-init.elを使用する場合、これらのファイルが行ったload-pathにたいする変更はすべて、ダンプ後失われます。
このコマンドは、ライブラリーlibraryの正確なファイル名を探します。loadと同じ方法でライブラリーを検索し、引数nosuffixもloadの場合と同じ意味です。libraryに指定する名前には、サフィックス‘.elc’または‘.el’を追加しないでください。
pathが非nilの場合は、load-pathのかわりにディレクトリーのリストが使用されます。
locate-libraryがプログラムから呼び出されたときは、ファイル名を文字列としてリターンします。ユーザーがインタラクティブにlocate-libraryを実行したときは、引数interactive-callがtとなり、これはlocate-libraryにたいしてファイル名をエコーエリアに表示するよう指示します。
このコマンドは、シャドー(shadowed)されたEmacs
Lispファイルを表示します。シャドーされたファイルとは、load-pathのディレクトリーに存在するにも関わらず、load-pathのディレクトリーリスト内で前の位置にある他のディレクトリーに同じ名前のファイルが存在するため、通常はロードされないファイルのことです。
たとえば、以下のようにload-pathがセットされていたとします
("/opt/emacs/site-lisp" "/usr/share/emacs/23.3/lisp")
そして、両方のディレクトリーにfoo.elという名前のファイルがあるとします。この場合、(require
'foo)は決して2つ目のディレクトリーのファイルをロードしません。このような状況は、Emacsがインストールされた方法に問題があることを示唆します。
Lispから呼び出された場合、この関数はバッファー内に表示するかわりに、シャドーされたファイルリストのメッセージをプリントします。オプション引数stringpが非nilの場合は、かわりにシャドーされたファイルを文字列としてリターンします。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lispプログラムが非ASCII文字の文字列定数を含むとき、Emacsではそれらをユニバイト文字列またはマルチバイト文字列のどちらかで表現される場合があります。どちらの表現が使用されるかは、そのファイルがどのようにEmacsに読み込まれたかに依存します。マルチバイト表現へのデコーディングとともに読み込まれた場合、Lispプログラム内のテキストはマルチバイトのテキストとなり、ファイル内の文字列定数はマルチバイト文字列になります。(たとえば)Latin-1文字を含むファイルをデコーディングなしで読み込んだ場合、そのプログラムのテキストはユニバイトのテキストとなり、ファイル内の文字列定数はユニバイト文字列になります。Coding Systemsを参照してください。
マルチバイト文字列がユニバイトバッファーに挿入されるときは自動的にユニバイトに変換されるため、大部分のEmacs
Lispプログラムにおいて、マルチバイト文字列が非ASCII文字列であるという事実を意識させないようにすべきです。しかしこれが行われことにより違いが生じる場合には、ローカル変数セクションに‘coding:
raw-text’と記述することにより、特定のLispファイルを強制的にユニバイトとして解釈させることができます。この識別子により、そのファイルは無条件でユニバイトとして解釈されます。これは、?vliteralで記述された非ASCII文字にキーバインドするとき重要になります。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
オートロード(autoload: 自動ロード)の機能により、定義されているファイルをロードすることなく、関数やマクロの存在を登録できます。関数の最初の呼び出しで、実際の定義およびその他の関連するコードをインストールするために適切なライブラリーを自動的にロードし、すべてがすでにロードされていたかのように、実際の定義を実行します。関数やマクロのドキュメントを参照することによっても、オートロードが発生します(Documentation Basicsを参照)。
オートロードされた関数をセットアップするには、2つの方法があります。それはautoloadを呼び出す方法と、ソースの実際の定義の前に、特別な“マジック”コメントを記述する方法です。autoloadはオートロードのための低レベルのプリミティブです。任意のLispプログラムが、任意のときにautoloadを呼び出すことができます。Emacsととみにインストールされるパッケージにとって、マジックコメントは関数をオートロードできるようににするための一番便利な方法です。コメント自身は何も行いませんが、コマンドupdate-file-autoloadsにたいするガイドを努めます。このコマンドはautoloadの呼び出しを構築し、Emacsビルド時に実行されるようアレンジします。
この関数は、filenameから自動的にロードされるように、functionという名前の関数(またはマクロ)を定義します。文字列filenameのは、functionの実際の定義を取得するファイルを指定します。
filenameがディレクトリー名とサフィックス.elと.elcのどちらも含まない場合、この関数はこれらの強制的にサフィックスを追加します。つまりサフィックスが追加されないただのfilenameという名前のファイルはロードされません。(変数load-suffixesにより要求される正確なサフィックスが指定されます。)
引数docstringは、その関数のドキュメント文字列です。autoloadの呼び出しでドキュメント文字列を指定することにより、その関数の実際の定義をロードせずにドキュメントを見ることが可能になります。この引数の値は通常、関数定義のドキュメント文字列と等しくあるべきです。もし等しくない場合は、その関数のドキュメント文字列がロード時に有効になります。
interactiveが非nilの場合、その関数はインタラクティブに呼び出すことが可能になります。これにより、functionの実際の定義をロードせずに、M-xによる補完が機能するようになります。。ここでは、完全なインタラクティブ指定は与えられません。完全な指定はユーザーが実際にfunctionを呼び出すまで必要ありません。実際にユーザーが呼び出したときに、実際の定義がロードされます。
普通の関数と同様、マクロおよびキーマップをオートロードできます。functionが実際にはマクロの場合はtypeにmacroを指定し、キーマップの場合にはtypeにkeymapを指定します。Emacsのさまざまな部分は、実際の定義をロードせずに、これらの情報を知る必要があるのです。
オートロードされたキーマップは、あるプレフィクスキーがシンボルfunctionにバインドされているときにキーを探す間に、自動的にロードされます。そのキーマップにたいする他の類のアクセスでは、オートロードは発生しません。特に、Lispプログラムが変数の値からそのキーマップを取得してdefine-keyを呼び出した場合には、たとえその変数の名前がシンボルfunctionと同じであっても、オートロードは起こりません。
functionが非voidのオートロードされたオブジェクトではない関数定義をもつ場合、その関数は何も行わずnilをリターンします。それ以外は、オートロードされたオブジェクト(Autoload Typeを参照)を作成して、それをfunctionにたいする関数定義として格納します。オートロードされたオブジェクトは、以下の形式をもちます:
(autoload filename docstring interactive type)
たとえば、
(symbol-function 'run-prolog)
⇒ (autoload "prolog" 169681 t nil)
このような場合、"prolog"はロードするファイルの名前、169681はemacs/etc/DOCファイル(Documentation Basicsを参照)内のドキュメント文字列への参照で、tはその関数がインタラクティブであり、nilはそれがマクロやキーマップでないことを意味します。
この関数は、objectがオートロードされたオブジェクトの場合、非nilをリターンします。たとえば、run-prologがオートロードされたオブジェクトかチェックするには、以下を評価します
(autoloadp (symbol-function 'run-prolog))
オートロードされたファイルは、通常は他の定義を含み、1つ以上の機能を必要あるいは提供するかもしれません。(内容の評価でのエラーにより)そのファイルが完全にロードされていない場合、そのロードの間に行われた関数定義やprovideの呼び出しはアンドゥされます。これは、このファイルからオートロードされる関数にたいして再度呼び出しを試みたときに、そのファイルを確実に再ロードさせるためです。このようにしないと、そのファイル内のいくつかの関数はアボートしたロードにより定義されていて、それらはロードされなかった修正後のファイルで提供される正しいサブルーチンを欠くため、正しく機能しないからです。
オートロードされたファイルが意図したLisp関数、またはマクロの定義に失敗した場合には、データ"Autoloading failed to
define function function-name"とともにエラーがシグナルされます。
オートロードのマジックコメント(autoload
cookieとも呼ばれる)は、オートロード可能なソースファイル内の実際の定義の直前にある、‘;;;###autoload’だけの行から構成されます。コマンドM-x
update-file-autoloadsは、対応するautoload呼び出しをloaddefs.el内に書き込みます。(autoload
cookieとなる文字列と、update-file-autoloadsにより生成されるファイルの名前は、上述のデフォルトから変更可能です。以下を参照。)
Emacsのビルドではloaddefs.elをロードするためにautoloadを呼び出します。M-x
update-directory-autoloadsは、より強力です。このコマンドはカレントディレクトリー内のすべてのファイルにたいするオートロードを更新します。
このマジックコメントは、任意の種類のフォームを、loaddefs.el内にコピーできます。このマジックコメントに続くフォームは、そのままコピーされます。しかしオートロード機能が特別に処理するフォームの場合は除外されます(たとえばautoload内への変換)。以下は、そのままコピーされないフォームです:
defunとdefmacro。cl-defunとcl-defmacro(Argument
Lists in Common Lisp
Extensionsを参照)、およびdefine-overloadable-function
(mode-local.el内のコメントを参照)も該当
define-minor-mode、define-globalized-minor-mode、define-generic-mode、define-derived-mode、easy-mmode-define-minor-mode、easy-mmode-define-global-mode、define-compilation-mode、define-global-minor-mode。
defcustom、defgroup、defclass
(EIEIO in EIEIOを参照)、およびdefine-skeleton
(skeleton.el内のコメントを参照)。
ビルド時に、そのファイル自身をロードするときにフォームを実行しないように、マジックコメントを使用することもできます。これを行なうには、マジックコメントと同じ行にフォームを記述します。これはコメントなので、ソースファイルをロードするとき何も行いません。ただしM-x update-file-autoloadsは、Emacsビルド時に実行されたものは、M-x update-file-autoloadsにコピーします。
以下は、マジックコメントによるオートロードのためにdoctorを準備する例です:
;;;###autoload (defun doctor () "Switch to *doctor* buffer and start giving psychotherapy." (interactive) (switch-to-buffer "*doctor*") (doctor-mode))
これにより、以下がloaddefs.el内に書き込まれます:
(autoload (quote doctor) "doctor" "\ Switch to *doctor* buffer and start giving psychotherapy. \(fn)" t nil)
ダブルクォートの直後のバックスラッシュまたは改行は、loaddefs.elのようなプリロードされた未コンパイルだけに使用される慣習です。これは、make-docfileにたいして、ドキュメント文字列をetc/DOCファイルに配するよう指示します。Building Emacsを参照してください。また、lib-src/make-docfile.c内のコメントも参照してください。ドキュメント文字列の使い方(usage
part)の中の‘(fn)’は、種々のヘルプ関数(Help Functionsを参照)が表示するとき、その関数の名前に置き換えられます。
関数定義手法として既知ではなく、認められてもいないような、通常とは異なるマクロにより関数定義を記述した場合、通常のオートロードのマジックコメントの使用により、定義全体がloaddefs.el内にコピーされるでしょう。これは期待した動作ではありません。かわりに以下を記述することにより、意図したautoload呼び出しをloaddefs.el内に配することができます。
;;;###autoload (autoload 'foo "myfile") (mydefunmacro foo ...)
autoload cookieとして、デフォルト以外の文字列を使用して、デフォルトのloaddefs.elとは異なるファイル内に、対応するオートロード呼び出しを記述できます。これを制御するために、Emacsは2つの変数を提供します:
この変数の値は、Lispコメントの文法に準じた文字列です。M-x
update-file-autoloadsは、そのcookieの後のLispフォームを、cookieが生成したオートロードファイル内にコピーします。この変数のデフォルト値は、";;;###autoload"です。
この変数の値は、オートロード呼び出しが書き込まれるEmacs Lispファイルを命名します。デフォルト値はloaddefs.elですが、(たとえば.elファイル内のセクション“Local Variables”))をオーバーライドできます。オートロードファイルは、フォームフィード文字で開始される終端を含んでいると仮定されます。
以下の関数は、オートロードオブジェクトにより指定されたライブラリーを明示的にロードするために使用されるかもしれません:
この関数はオートロードオブジェクトautoloadにより指定されたロードを処理します。オプション引数nameに非nilを指定する場合は、関数値がautoloadとなるシンボルを指定します。この場合、この関数のリターン値は、そのシンボルの新しい関数値になります。オプション引数macro-onlyの値がmacroの場合、この関数は関数ではなくマクロのロードだけを有効にします。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
1つのEmacsセッション内で、ファイルを複数回ロードできます。たとえば、バッファーで関数定義を編集して再インストールした後に、元のバージョンに戻したいときがあるかもしれません。これは、元のファイルをリロードすることにより行なうことができます。
ファイルをロードまたはリロードするとき、loadおよびload-library関数は未コンパイルのファイルではなく、バイトコンパイルされた同名のファイルを自動的にロードすることに留意してください。ファイルを再記述して保存後に再インストールする場合には、新しいバージョンをバイトコンパイルする必要があります。さもないと、Emacsは新しいソースではなく、古いバイトコンパイルされたファイルをロードしてしまうでしょう!
その場合には、ファイルロード時に表示されるメッセージに、そのファイルのリコンパイルを促す‘(compiled; note, source is
newer)’というメッセージが含まれます。
Lispライブラリーファイル内にフォームを記述するときは、そのファイルが複数回ロードされるかもしれないことに留意してください。たとえば、そのライブラリーをリロードするときには、各変数が最初期化されるべきかどうか考慮してください。。変数がすでに初期化されている場合、defvarはその変数の値を変更しません(Defining Global Variablesを参照)。
alistに要素を追加するもっともシンプルな方法は、以下のようなものでしょう:
(push '(leif-mode " Leif") minor-mode-alist)
しかし、これはそのライブラリーがリロードされた場合は、複数の要素を追加してしまうでしょう。この問題を避けるには、add-to-list(Modifying List Variablesを参照)を使用します:
(add-to-list 'minor-mode-alist '(leif-mode " Leif"))
時には、ライブラリーが既にロード済みか、明示的にテストしたいときがあるでしょう。そのライブラリーがprovideを使用して名前付きフィーチャ(named
feature)を提供する場合は、featurepを使用して前にprovideが実行されているかテストすることができます。かわりに、以下のようにすることもできます:
(defvar foo-was-loaded nil) (unless foo-was-loaded execute-first-time-only (setq foo-was-loaded t))
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
provideとrequireは、autoloadにかわるファイルを自動的にロードする関数です。これらは名前付きのフィーチャ(feature:
機能)という面で機能します。オートロードは特定の関数の呼び出しをトリガーにしますが、フィーチャーは最初は他のプログラムが名前により問い合わせたときにロードされます。
フィーチャ名とは、関数、変数などのコレクションを表すシンボルです。これらを定義するファイルは、そのフィーチャをプロバイド(provide: 提供)すべきです。これらのフィーチャを使用する他のプログラムは、その機能をリクワイア(require: 要求)することにより、それらが定義されているか確認できるでしょう。これは、定義がまだロードされていなければ、定義ファイルをロードします。
フィーチャをリクワイアするには、フィーチャ名を引数としてrequireを呼び出します。requireは、意図する機能がすでにプロバイドされているか確認するために、グローバル変数featuresを調べます。もしプロバイドされていなければ、適切なファイルからそのフィーチャをロードします。このファイルは、そのフィーチャをfeaturesに追加するために、トップレベルでprovideを呼び出すべきです。これに失敗すると、requireはエラーをシグナルします。
たとえば、idlwave.el内のidlwave-complete-filenameにたいする定義には、以下のコードが含まれます:
(defun idlwave-complete-filename ()
"Use the comint stuff to complete a file name."
(require 'comint)
(let* ((comint-file-name-chars "~/A-Za-z0-9+@:_.$#%={}\\-")
(comint-completion-addsuffix nil)
...)
(comint-dynamic-complete-filename)))
式(require
'comint)は、comint.elがまだロードされていなければ、comint-dynamic-complete-filenameが確実に定義されるように、そのファイルをロードします。フィーチャは通常、それらを提供するファイルにしたがって命名されるため、requireにファイル名を与える必要はありません。(require命令文がletのボディーの外側にあるのが重要なことに注意してください。変数がletバインドされているライブラリーをロードすることにより、意図せぬ結果、つまりletをexitした後にその変数がアンバインドされます。)
comint.elには以下のトップレベル式が含まれます:
(provide 'comint)
これはcomintはグローバルなリストfeaturesに追加するので、(require
'comint)は今後何も行う必要がないことを知ることができます。
ファイルのトップレベルrequireが使用されたときは、それをロードしたときと同様、そのファイルをバイトコンパイル(Byte Compilationを参照)したときにも効果が表れます。これはリクワイアされたパッケージがマクロを含み、バイトコンパイラーがそれを知らなければならない場合です。これはrequireによりロードされるファイルで定義される関数と変数にたいするバイトコンパイラーの警告も無効にします。
バイトコンパイルの間にトップレベルのrequireが評価されるとしても、provide呼び出しは評価されません。したがって、以下の例のようにprovideの後に同じ機能にたいするrequireを含めることにより、バイトコンパイル前に定義しているファイルを確実にロードできます。
(provide 'my-feature) ; バイトコンパイラーには無視され、
; loadには評価される。
(require 'my-feature) ; バイトコンパイラーにより評価される。
コンパイラーはprovideを無視して、その後に対象のファイルをロードすることによりrequireが処理されます。ファイルのロードはprovide呼び出しを実行するので、後続のrequireはファイルがロードされているときは何も行いません。
この関数は、カレントEmacsセッションにfeatureがロードされた、あるいはロードされつつあることをアナウンスします。これは、featureに関連する機能が他のLispプログラムから利用可能できる、あるいは利用可能になることを意味します。
provideを呼び出すことによる直接的な効果は、まだfeatureがfeatures内に存在しない場合はリストの先頭に追加して、それを必要としているeval-after-loadコードを呼び出します(Hooks for Loadingを参照)。引数featureはシンボルでなければなりません。provideはfeatureをリターンします。
subfeaturesが与えられた場合、それはfeatureの当該バージョンによりプロバイドされる特定のサブフィーチャのセットを示すシンボルのリストであるべきです。featurepを使用して、サブフィーチャの存在をテストできます。あるパッケージの、ロードされるか、あるいはそのバージョンに存在するか不明なさまざまな部分や機能に名前を与えて使いやすくするには、そのパッケージが複雑すぎるときにサブフィーチャを使用するというのがサブフィーチャというアイデアです。例としては、Testing Availability of Network Featuresを参照してください。
features
⇒ (bar bish)
(provide 'foo)
⇒ foo
features
⇒ (foo bar bish)
オートロードによりあるファイルがロードされて、その内容の評価エラーによりストップいたとき、そのロードの間に発生した関数定義やprovide呼び出しはアンドゥされます。Autoloadを参照してください。
この関数はカレントEmacsセッションにおいて、featureが存在するかどうかを、((featurep
feature)を使用して。以下を参照)をチェックします。引数featureはシンボルでなければなりません。
そのフィーチャが存在しない場合、requireはloadによりfilenameをロードします。filenameが与えられなかった場合は、シンボルfeatureの名前がロードするファイル名のベースとして使用されます。しかしこの場合、requireはfeatureを探すためにサフィックス‘.el’および‘.elc’の追加を強制します(圧縮ファイルのサフィックスに拡張されるかもしれません)。名前がただのfeatureというファイルは使用されません。(変数load-suffixesは要求されるLispサフィックスを正確に指定します。)
noerrorが非nilの場合は、ファイルの実際のロードにおけるエラーを抑止します。この場合、そのファイルのロードが失敗すると、requireはnilをリターンします。通常では、requireはfeatureをリターンします。
ファイルのロードは成功したがfeatureをプロバイドしていない場合、requireは‘Required
feature feature was not provided’のようにエラーをシグナルします。
この関数は、カレントEmacsセッションfeatureがプロバイドされている場合(たとえばfeaturefeaturesのメンバーの場合)はtをリターンします。subfeatureが非nilの場合、この関数はサブフィーチャも同様にプロバイドされているとき(たとえばsubfeatureがシンボルfeatureのプロパティsubfeatureのメンバーのとき)だけtをリターンします。
この変数の値はシンボルのリストで、このシンボルはカレントEmacsセッションにロードされたフィーチャです。シンボルはそれぞれprovideを呼び出すことにより、このリストにputされたものです。リストfeatures内の要素の順番に意味はありません。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この関数は、symbolを定義しているファイルの名前をリターンします。typeがnilの場合は、どのようなタイプの定義も受け入れられます。typeがdefunの場合は関数定義、defvarは変数定義、deffaceはフェイス定義だけを指定します。
値は通常、絶対ファイル名です。定義がどのファイルにも関係しないときは、nilになることもあります。symbolがオートロード関数を指定する場合、値が拡張子なしの相対ファイル名になることもあります。
symbol-fileは変数load-history.<の値にもとづいています。
この変数の値は、ロードされたライブラリーファイルの名前を、それらが定義する関数と変数の名前、およびそれらがプロバイドまたはリクワイアするフィーチャに関連付けるalistです。
このalist内の各要素は、1つのロード済みライブラリー(スタートアップ時にプリロードされたライブラリーを含む)を記述します。要素はCARがライブラリーの絶対ファイル名(文字列)のリストです。残りのリスト要素は、以下の形式です:
varシンボルvarが変数として定義された。
(defun . fun)関数funが定義された。
(t . fun)関数funは、このライブラリーがそれを関数として再定義する前はオートロードとして定義されていた。後続の要素は常に(defun
. fun)で、これはfunを関数として定義する。
(autoload . fun)関数funはオートロードとして定義された。
(defface . face)フェイスfaceが定義された。
(require . feature)フィーチャfeatureがリクワイアされた。
(provide . feature)フィーチャfeatureがプロバイドされた。
load-historyの値には、CARがnilの要素が1つ含まれるかもしれません。この要素は、ファイルをvisitしていないバッファーでのeval-bufferで作成された定義を記述します。
コマンドeval-regionはload-historyを更新しますが、要素を置き換えずに、visitされているファイルの要素にたいして定義されたシンボルを追加します。Evalを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
他のLispオブジェクト用にメモリーを回収するために、ライブラリーによりロードされた関数や変数を破棄することができます。これを行うには、関数unload-featureを使用します:
このコマンドはフィーチャfeatureをプロバイドしていたライブラリーをアンロードします。そのライブラリー内のdefun、defalias、defsubst、defmacro、defconst、defvar、defcustomにより定義されたすべての関数、マクロ、変数は未定義になります。その後、それらのシンボルにたいして事前に関連付けられていたオートロードをリストアします。(ロードはシンボルのautoloadプロパティにこれらを保存しています。)
以前の定義をリストアする前に、特定のフックからそのライブラリー内の関数を取り除くために、unload-featureはremove-hookを実行します。これらのフックには、名前が‘-hook’(または廃止されたサフィックス‘-hooks’)で終わる変数、加えてunload-feature-special-hooks、同様にauto-mode-alistにリストされた変数も含まれます。これは、重要なフックがすでに定義されていない関数を参照をすることにより、Emacsの機能が停止することを防ぐためです。
標準的なアンロードアクティビティは、そのライブラリー内の関数のELPプロファイリングを取り消し、そのライブラリーによりプロバイドされたフィーチャを取り消し、そのライブラリーで定義された変数に保持されたタイマーも取り消します。
これらの基準が機能不全を防ぐのに十分でない場合、ライブラリーはfeature-unload-functionという名前の明示的なアンローダーを定義できます。そのシンボルが関数として定義された場合、unload-featureは何かを行う前にまず引数なしでそれを呼び出します。これはライブラリーをアンロードしるために適切なすべてのことを行うことができます。これがnilをリターンした場合、unload-featureは通常のアンロードアクションを処理します。それ以外は、アンロード処理は完了したとみなします。
unload-featureは通常、他のライブラリーが依存するライブラリーのアンロードを拒絶します。(ライブラリーbにたいするrequireがライブラリーaに含まれる場合、aはbに依存します。)オプション引数forceが非nilの場合、依存関係は無視され、どのようなライブラリーもアンロードできます。
unload-feature関数はLispで記述されており、その動作は変数load-historyにもとづきます。
この変数には、ライブラリー内で定義された関数を取り除くために、ライブラリーをアンロードする前にスキャンされるフックのリストが保持されています。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
変数after-load-functionsを使用することにより、Emacsがライブラリーをロードするたびにコードを実行させることができます:
このアブノーマルフック(abnormal hook)は、ファイルをロードした後に実行されます。フック内の各関数は1つの引数(ロードされたファイルの絶対ファイル名)で呼び出されます。
特定のライブラリーがロードされた後にコードを実行したい場合は、マクロwith-eval-after-loadを使用します:
このマクロはlibraryがロードされるたびに、ファイルlibraryのロードの最後でbodyが評価されるよう準備します。libraryがすでにロード済みの場合は、即座にbodyを評価します。
ファイル名libraryにディレクトリーや拡張子を与える必要はありません。通常は以下のようにファイル名だけを与えます:
(with-eval-after-load "edebug" (def-edebug-spec c-point t))
どのファイルが評価をトリガーできるか制限するには、ディレクトリーか拡張子、またはしの両方をlibraryに含めます。実際のファイル名(たとえばすべてのシンボリックリンク名は除外される)が、与えられた名前すべてにマッチするファイルだけが、マッチします。以下の例では、どこかのディレクトリー..../foo/barにあるmy_inst.elcやmy_inst.elc.gzは評価をトリガーしますが、my_inst.elは異なります。:
(with-eval-after-load "foo/bar/my_inst.elc" …)
libraryはフィーチャ(たとえばシンボル)でもよく、その場合(provide
library)を呼び出す任意のファイルの最後にbodyが評価されます。
body内のエラーはロードをアンドゥしませんが、bodyの残りの実行を妨げます。
上手く設計されたLispプログラムは通常、eval-after-loadを使用するべきではありません。(外部からの使用を意図した)他のライブラリーで定義された変数を調べたりセットする必要がある場合、それは即座に行うことができます
−−−
そのライブラリーがロードされるのを待つ必要はありません。そのライブラリーで定義された関数を呼び出す必要がある場合は、そのライブラリーをロードすべきで、それにはrequire(Featuresを参照)が適しています。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lispには、Lispで記述された関数を、より効率的に実行できるバイトコード(byte-code)と呼ばれる特別な表現に翻訳するコンパイラー(compiler)があります。コンパイラーはLispの関数定義をバイトコードに置き換えます。バイトコード関数が呼び出されたとき、その定義はバイトコードインタープリター(byte-code interpreter)により評価されます。
バイトコンパイルされたコードは、(本当のコンパイル済みコードのように)そのマシンのハードウェアにより直接実行されるのではなく、バイトコンパイラーにより評価されるため、バイトコードはリコンパイルしなくてもマシン間での完全な可搬性を有します。しかし、本当にコンパイルされたコードほど高速ではありません。
一般的に、任意のバージョンのEmacsはそれ以前のバージョンのEmacsにより生成されたバイトコンパイル済みコードを実行できますが、逆は成り立ちません。
あるLispファイルを常にコンパイルせずに実行したい場合は、以下のようにno-byte-compileにバインドするファイルローカル変数を配します:
;; -*-no-byte-compile: t; -*-
| 16.1 Performance of Byte-Compiled Code | バイトコンパイルによるスピードアップ例。 | |
| 16.2 Byte-Compilation Functions | バイトコンパイル関数。 | |
| 16.3 Documentation Strings and Compilation | ドキュメント文字列のダイナミックロード。 | |
| 16.4 Dynamic Loading of Individual Functions | 個々の関数のダイナミックロード。 | |
| 16.5 Evaluation During Compilation | コンパイル時に評価されるコード。 | |
| 16.6 Compiler Errors | コンパイラーのエラーメッセージの扱い。 | |
| 16.7 Byte-Code Function Objects | バイトコンパイル済み関数に使用されるデータ型。 | |
| 16.8 Disassembled Byte-Code | バイトコードの逆アセンブル; バイトコードの読み方。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バイトコンパイルされた関数はCで記述されたプリミティブ関数ほど効率的ではありませんがLispで記述されたバージョンよりは高速に実行されます。以下は例です:
(defun silly-loop (n)
"Return the time, in seconds, to run N iterations of a loop."
(let ((t1 (float-time)))
(while (> (setq n (1- n)) 0))
(- (float-time) t1)))
⇒ silly-loop
(silly-loop 50000000) ⇒ 10.235304117202759
(byte-compile 'silly-loop)
⇒ [コンパイルされたコードは表示されない]
(silly-loop 50000000) ⇒ 3.705854892730713
この例では、インタープリターによる実行には10秒を要しますが、バイトコンパイルされたコードは4秒未満です。これは典型的な結果例ですが、実際の結果はさまざまでしょう。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
byte-compileにより、関数やマクロを個別にバイトコンパイルできます。byte-compile-fileでファイル全体、byte-recompile-directoryまたはbatch-byte-compileで複数ファイルをコンパイルできます。
バイトコンパイラーが警告、および/またはエラーメッセージを生成することもあります(詳細はCompiler Errorsを参照)。これらのメッセージはCompilationモードが使用する*Compile-Log*と呼ばれるバッファーに記録されます。Compilation Mode in The GNU Emacs Manualを参照してください。
バイトコンパイルを意図したファイル内にマクロ呼び出しを記述する際は、注意が必要です。マクロ呼び出しはコンパイル時に展開されるので、そのマクロはEmacsにロードされる必要があります(さもないとバイトコンパイラーは正しく処理しないでしょう)。これを処理する通常の方法は、必要なマクロ定義を含むファイルをrequireフォームで指定することです。バイトコンパイラーは通常、コンパイルするコードを評価しませんが、requireフォームは指定されたライブラリーをロードすることにより特別に扱われます。誰かがコンパイルされたプログラムを実行する際に、マクロ定義ファイルのロードを回避するには、require呼び出しの周囲にeval-when-compileを記述します(Evaluation During Compilationを参照)。詳細はMacros and Byte Compilationを参照してください。
インライン(defsubst)の関数は、これほど面倒ではありません。定義が判明する前にそのような関数呼び出しをコンパイルした場合でも、その呼び出しは低速になるだけで、正しく機能するでしょう。
この関数はsymbolの関数定義をバイトコンパイルして、以前の定義をコンパイルされた定義に置き換えます。symbolの関数定義は、その関数にたいする実際のコードでなければなりません。byte-compileはインダイレクト関数を処理しません。リターン値は、symbolのコンパイルされた定義であるバイトコード関数ブジェクトです(Byte-Code Function Objectsを参照)。
(defun factorial (integer)
"INTEGERの階乗を計算する。"
(if (= 1 integer) 1
(* integer (factorial (1- integer)))))
⇒ factorial
(byte-compile 'factorial) ⇒ #[(integer) "^H\301U\203^H^@\301\207\302^H\303^HS!\"\207" [integer 1 * factorial] 4 "Compute factorial of INTEGER."]
symbolの定義がバイトコード関数オブジェクトの場合、byte-compileは何も行わずnilをリターンします。そのシンボルの関数セル内の(コンパイルされていない)オリジナルのコードはすでにバイトコンパイルされたコードに置き換えられているので、“シンボルの定義の再コンパイル”はしません。
byte-compileの引数としてlambda式も指定できます。この場合、関数は対応するコンパイル済みコードをリターンしますが、それはどこにも格納されません。
このコマンドはポイントを含むdefunを読み取りそれをコンパイルして、結果を評価します。実際に関数定義であるようなdefunでこれを使用した場合は、その関数のコンパイル済みバージョンをインストールする効果があります。
compile-defunは通常、評価した結果をエコーエリアに表示しますが、argが非nilの場合は、そのフォームをコンパイルした後にカレントバッファーに結果を挿入します。
この関数はfilenameという名前のLispコードファイルを、バイトコードのファイルにコンパイルします。出力となるファイルの名前は、サフィックス‘.el’を‘.elc’に変更することにより作成されます。filenameが‘.el’で終了しない場合は、‘.elc’をfilenameの最後に付け足します。
コンパイルは入力ファイルから1つのフォームを逐次読み取ることにより機能します。フォームが関数またはマクロの場合は、コンパイル済みの関数またはマクロが書き込まれます。それ以外のフォームはまとめられて、まとめられたものごとにコンパイルされ、そのファイルが読まれたとき実行されるようにコンパイルされたコードが書き込まれます。入力ファイルを読み取る際、すべてのコメントは無視されます。
このコマンドはエラーのないときはt、それ以外はnilをリターンします。インタラクティブに呼び出されたときは、ファイル名の入力をもとめます。
loadが非nilの場合、このコマンドはコンパイルした後にコンパイルされたファイルをロードします。インタラクティブに呼び出された場合、loadはプレフィクス引数です。
$ ls -l push* -rw-r--r-- 1 lewis lewis 791 Oct 5 20:31 push.el
(byte-compile-file "~/emacs/push.el")
⇒ t
$ ls -l push* -rw-r--r-- 1 lewis lewis 791 Oct 5 20:31 push.el -rw-rw-rw- 1 lewis lewis 638 Oct 8 20:25 push.elc
このコマンドは、directory(またはそのサブディレクトリー)内の、リコンパイルを要するすべての‘.el’ファイルをリコンパイルします。‘.elc’ファイルが存在し、それが‘.el’より古いファイルは、リコンパイルが必要です。
‘.el’ファイルに対応する‘.elc’ファイルが存在しない場合、何を行うかをflagで指定します。nilの場合、このコマンドはこれらのファイルを無視します。flagが0のときは、それらをコンパイルします。nilと0以外の場合は、それらのファイルをコンパイルするかユーザーに尋ね、同様にそれぞれのサブディレクトリーについても尋ねます。
インタラクティブに呼び出された場合、byte-recompile-directoryはdirectoryの入力を求め、flagはプレフィクス引数になります。
forceが非nilの場合、このコマンドは‘.elc’ファイルのあるすべての‘.el’ファイルをリコンパイルします。
リターン値は不定です。
この関数は、コマンドラインで指定されたファイルにたいして、byte-compile-fileを実行します。この関数は処理が完了するとEmacsをkillするので、Emacsのバッチ実行だけで使用しなければなりません。1つのファイルでエラーが発生しても、それにより後続のファイルにたいする処理が妨げられることはありませんが、そのファイルにたいする出力ファイルは生成されず、Emacsプロセスは0以外のステータスコードで終了します。
noforceが非nilの場合、この関数は最新の‘.elc’ファイルがあるファイルをリコンパイルしません。
$ emacs -batch -f batch-byte-compile *.el
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacsがバイトコンパイルされたファイルから関数や変数をロードする際、通常はメモリー内にそれらのドキュメント文字列をロードしません。それぞれのドキュメント文字列は、必要なときだけバイトコンパイルされたファイルから“ダイナミック(dynamic: 動的)”にロードされます。ドキュメント文字列の処理をスキップすることにより、メモリーが節約され、ロードが高速になります。
この機能には欠点があります。コンパイル済みのファイルを削除、移動、または(新しいバージョンのコンパイル等で)変更した場合、Emacsは前にロードされた関数や変数のドキュメント文字列にアクセスできなくなるでしょう。このような問題は通常、あなた自身がEmacsをビルドした場合に、そのLispファイルを編集、および/またはリコンパイルしたときだけ発生します。この問題は、リコンパイル後にそれぞれのファイルをリロードするだけで解決します。
バイトコンパイルされたファイルからのドキュメント文字列のダイナミックロードは、バイトコンパイルされたファイルごとに、コンパイル時に決定されます。これはオプションbyte-compile-dynamic-docstringsにより、無効にできます。
これが非nilの場合、バイトコンパイラーはドキュメント文字列をダイナミックロードするようセットアップしたコンパイル済みファイルを生成します。
特定のファイルでダイナミックロード機能を無効にするには、以下のようにヘッダー行(Local
Variables in Files in The GNU Emacs
Manualを参照)で、このオプションにnilをセットします。
-*-byte-compile-dynamic-docstrings: nil;-*-
これは主に、あるファイルを変更しようとしていて、そのファイルをすでにロード済みのEmacsセッションがファイルを変更した際にも正しく機能し続けることを望む場合に有用です。
内部的には、ドキュメント文字列のダイナミックロードは、特殊なLispリーダー構成‘#@count’とともにコンパイル済みファイルに書き込むことにより達成されます。この構成は、次のcount文字をスキップします。さらに‘#$’構成も使用され、これは“このファイルの名前(文字列)”を意味します。これらの構成をLispソースファイル内で使用しないでください。これらは人間がファイルを読む際に明確であるようデザインされていません。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ファイルをコンパイルするとき、オプションでダイナミック関数ロード(dynamic function loading)機能(laxyロード(lazy loading)とも呼ばれる)を有効にできます。ダイナミック関数ロードでは、ファイルのロードでファイル内の関数定義は完全には読み込まれません。かわりに、各関数定義にはそのファイルを参照するプレースホルダーが含まれます。それぞれ関数が最初に呼び出されるときに、そのプレースホルダーを置き換えるために、ファイルから完全な定義が読み込まれます。
ダイナミック関数ロードの利点は、ファイルのロードがより高速になることです。ユーザーが呼び出せる関数を多く含むファイルにとって、それらの関数のうち1つを使用したら、おそらく残りの関数も使用するというのでなければ、これは利点です。多くのキーボードコマンドを提供する特化したモードは、このパターンの使い方をする場合があります。ユーザーはそのモードを呼び出すかもしれませんが、使用するのはそのモードが提供するコマンドのわずか一部です。
ダイナミックロード機能には、いくつか不利な点があります:
このような問題は、通常の状況でインストールされたEmacsファイルでは決して発生しません。しかし、あなたが変更したLispファイルでは発生し得ます。それぞれのファイルをリコンパイルしたらすぐに、新たなコンパイル済みファイルをリロードするのが、これらの問題を回避する一番簡単な方法です。
コンパイル時に変数byte-compile-dynamicが非nilの場合、バイトコンパイラーはダイナミック関数ロード機能を使用します。ダイナミックロードが望ましいのは特定のファイルにたいしてだけなので、この変数をグローバルにセットしないでください。そのかわりに、特定のソースファイルのファイルローカル変数で、この機能を有効にしてください。たとえば、ソースファイルの最初の行に以下のテキストを記述することにより、これを行うことができます:
-*-byte-compile-dynamic: t;-*-
これが非nilの場合、バイトコンパイラーはダイナミック関数ロードのためにセットアップされたコンパイル済みファイルを生成します。
functionがバイトコード関数オブジェクトの場合、それがまだ完全にロードされていなければ、バイトコンパイル済みのファイルからのfunctionのバイトコードのロードを完了させます。それ以外は、何も行いません。この関数は、常にfunctionをリターンします。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
これらの機能により、プログラムのコンパイル中に評価されるコードを記述できます。
このフォームは、それを含むコードがコンパイルされるとき、および(コンパイルされているかいないかに関わらず)実行されるときの両方で、bodyが評価されるようにマークします。
bodyを別のファイルに配し、そのファイルをrequireで参照すれば、同様の結果が得られます。これはbodyが大きいとき望ましい方法です。事実上、requireは自動的にeval-and-compileされ、そのパッケージはコンパイル時と実行時の両方でロードされます。
autoloadも実際はeval-and-compileされます。これはコンパイル時に認識されるので、そのような関数の使用により警告“not
known to be defined”は生成されません。
ほとんどのeval-and-compileの使用は、完全に妥当であると言えます。
あるマクロがマクロの結果を構築するためのヘルパー関数をもち、そのマクロがそのパッケージにたいしてローカルと外部の両方で使用される場合には、コンパイル時と後の実行時にそのヘルパー関数を取得するために、eval-and-compileを使用すべきです。
関数がプログラム的に(fsetで)定義されている場合には、それがコンパイル時、同様に実行時に行われるように使用でき、それらの関数への呼び出しはチェックされます(“not
known to be defined”の警告は抑えられます)。
このフォームは、bodyがコンパイル時に評価され、コンパイルされたプログラムがロードされるときは評価されないようにマークします。コンパイラーによる評価の結果は、コンパイル済みのプログラム内の定数となります。ソースファイルをコンパイルではなくロードした場合、bodyは通常どおり評価されます。
生成するために何らかの計算が必要な定数がある場合、eval-when-compileはコンパイル時にそれを行なうことができます。たとえば、
(defvar my-regexp
(eval-when-compile (regexp-opt '("aaa" "aba" "abb"))))
他のパッケージを使用しているが、そのパッケージのマクロ(バイトコンパイラーはそれらを展開します)だけが必要な場合、それらを実行せずにコンパイル用にロードさせるためにeval-when-compileを使用できます。たとえば、
(eval-when-compile (require 'my-macro-package))
これらの事項は、マクロおよびdefsubst関数がローカルに定義され、そのファイル内だけで使用されることを要求します。これらは、そのファイルのコンパイルに必要ですが、コンパイル済みファイルの実行には、ほとんどの場合必要ありません。たとえば、
(eval-when-compile
(unless (fboundp 'some-new-thing)
(defmacro 'some-new-thing ()
(compatibility code))))
これは大抵他のバージョンのEmacsとの互換性にたいする保証だけのためのコードにたいして有用です。
Common Lispに関する注意: トップレベルでは、eval-when-compileはCommon
Lispのイディオム(eval-when (compile eval)
…)に類似しています。トップレベル以外では、Common
Lispのリーダーマクロ‘#.’(ただし解釈時を除く)が、eval-when-compileと近いことを行います。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バイトコンパイルのエラーメッセージと警告メッセージは、*Compile-Log*という名前のバッファーにプリントされます。これらのメッセージには、問題となる箇所を示すファイル名と行番号が含まれます。これらのメッセージにたいして、コンパイラー出力を操作する通常のEmacsコマンドが使用できます。
あるエラーがプログラムのシンタックスに由来する場合、バイトコンパイラーはエラーの正確な位置の取得に際し混乱するかもしれません。バッファー *Compiler Input*.にスイッチするのは、これを調べ1つの方法です。(このバッファー名はスペースで始まるので、Buffer Menuに表示されません。)このバッファーにはコンパイルされたプログラムと、バイトコンパイラーが読み取れた箇所からポイントがどれほど離れているかが含まれ、エラーの原因はその近傍にあるかもしれません。シンタックスエラーを見つけるヒントについては、Debugging Invalid Lisp Syntaxを参照してください。
定義されていない関数や変数の使用は、バイトコンパイラーにより報告される警告のタイプとしては一般的です。そのような警告では、定義されていない関数や変数を使用した位置ではなく、そのファイルの最後の行の行番号が報告されるので、それを見つけるには手作業で検索しなければなりません。
定義のない関数や変数の警告が間違いだと確信できる場合には、警告を抑制する方法がいくつかあります:
fboundpによるテストを行なうことで抑制できます:
(if (fboundp 'func) ...(func ...)...)
funcへの呼び出しはif文のthen-form内になければならず、funcはfboundp呼び出し内でクォートされていなければなりません。(この機能はcondでも同様に機能します。)
boundpテストで抑制できます:
(if (boundp 'variable) ...variable...)
variableへの参照はif文のthen-form内になければならず、variableはboundp呼び出し内でクォートされていなければなりません。
declare-functionを使用して定義されていると告げることができます。Telling the Compiler that a Function is Definedを参照してください。
defvarを使用して定義されているとコンパイラーに告げることができます。(これはその変数を特別な変数としてマークすることに注意してください。Defining Global Variablesを参照してください。
with-no-warnings構成を使用して特定の式にたいするコンパイラーのすべての任意の警告を抑制することもできます:
実行時には〜これは(progn
body...)と等価ですが、コンパイラーはbodyの中で起こるいかなる事項にたいしても警告を発しません。
わたしたちは、あなたが抑制したいと意図する警告以外の警告を失わないようにするために、可能な限り小さいコード断片にたいしてこの構成を使用することを推奨します。
変数byte-compile-warningsをセットすることにより、コンパイラーの警告をより詳細に制御できます。詳細は、変数のドキュメント文字列を参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バイトコンパイルされた関数は、特別なデータ型、バイトコード関数オブジェクト(byte-code function objects)をもちます。関数呼び出しとしてそのようなオブジェクトが出現したとき、Emacsはそのバイトコードを実行するために、常にバイトコードインタープリターを使用します。
内部的には、バイトコード関数オブジェクトはベクターによく似ています。バイトコード関数オブジェクトの要素には、arefを通じてアクセスできます。バイトコード関数オブジェクトのプリント表現(printed
representation)はベクターに似ていて、開き‘[’の前に‘#’が追加されます。バイト関数オブジェクトは少なくとも4つの要素をもたねばならず、要素数に上限はありません。しかし通常使用されるのは、最初の6要素です。これらは:
シンボル引数のリスト。
バイトコード命令を含む文字列。
バイトコードにより参照されるLispオブジェクトのベクター。関数名と変数名に使用されるシンボルが含まれる。
この関数が要するスタックの最大サイズ。
(もしあれば)ドキュメント文字列。それ以外はnil。ドキュメント文字列がファイルに格納されている場合、値は数字かリストかもしれない。本当のドキュメント文字列の取得には、関数documentationを使用する(Access to Documentation Stringsを参照)。
(もしあれば)インタラクティブ仕様。文字列かLisp式。インタラクティブでない関数ではnil。
以下は、バイトコード関数オブジェクトのプリント表現の例です。これはコマンドbackward-sexpの定義です。
#[(&optional arg) "^H\204^F^@\301^P\302^H[!\207" [arg 1 forward-sexp] 2 254435 "^p"]
バイトコードオブジェクトを作成する原始的な方法は、make-byte-codeです:
この関数はelementsを要素とするバイトコードオブジェクトを構築して、リターンします。
あなた自身が要素を収集してバイトコード関数を構築しないでください。それらが矛盾する場合、その関数の呼び出しによりEmacsがクラッシュするかもしれません。これらのオブジェクトの作成は、常にバイトコンパイラーにまかせてください。バイトコンパイラーは、要素を矛盾なく構築します(願わくば)。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
人はバイトコードを記述しません。それはバイトコンパイラーの仕事です。しかし、好奇心を満たすために、わたしたちはディスアセンブラを提供しています。ディスアセンブラは、バイトコードを人間が読めるフォームに変換します。
バイトコードインタープリターは、シンプルなスタックマシンとして実装されています。これは値を自身のスタックにpushして、計算で使用するためにそれらをpopして取り出し、おの結果を再びそのスタックにpushして戻します。バイトコード関数がリターンするときは、スタックから値をpopして取り出し、その関数の値としてリターンします。
それに加えてスタックとバイトコード関数は、値を変数とスタックの間で転送することにより、普通のLisp変数を使用したり、バインドおよびセットすることができます。
このコマンドは、objectにたいするディスアセンブルされたコードを表示します。インタラクティブに使用した場合、またはbuffer-or-nameがnilか省略された場合は、*Disassemble*という名前のバッファーに出力します。buffer-or-nameが非nilの場合は、バッファーもしくは既存のバッファーの名前でなければなりません。その場合は、そのバッファーのポイント位置に出力され、ポイントは出力の前に残りされます。
引数objectには関数名、ラムダ式(Lambda Expressionsを参照)、またはバイトコードオブジェクト(Byte-Code Function Objectsを参照)を指定できます。ラムダ式の場合、disassembleはそれをコンパイルしてから、そのコンパイル済みコードをディスアセンブルします。
以下にdisassemble関数を使用した例を2つ示します。バイトコードとLispソースを関連付ける助けとなるように、説明的なコメントを追加してあります。これらのコメントは、disassembleの出力にはありません。
(defun factorial (integer)
"Compute factorial of an integer."
(if (= 1 integer) 1
(* integer (factorial (1- integer)))))
⇒ factorial
(factorial 4)
⇒ 24
(disassemble 'factorial)
-| byte-code for factorial:
doc: Compute factorial of an integer.
args: (integer)
0 varref integer ; integerの値を取得して
; それをスタック上にpushする。
1 constant 1 ; スタック上に1をpushする。
2 eqlsign ; 2つの値をスタックからpopして取り出し、 ; それらを比較して結果をスタック上にpushする。
3 goto-if-nil 1 ; スタックのトップをpopしてテストする。
; nilなら1へ、それ以外はcontinue。
6 constant 1 ; スタックのトップに1をpushする。
7 return ; スタックのトップの要素をリターンする。
8:1 varref integer ;integerの値をスタック上にpushする。 9 constant factorial ;factorialをスタック上にpushする。 10 varref integer ;integerの値をスタック上にpushする。 11 sub1 ;integerをpopして値をデクリメントする。 ; スタック上に新しい値をpushする。 12 call 1 ; スタックの最初(トップ)の要素を引数として ; 関数factorialを呼び出す。 ; リターン値をスタック上にpushする。
13 mult ; スタックのトップ2要素をpopして取り出し乗じ ; 結果をスタック上にpushする。 14 return ; スタックのトップ要素をリターンする。
silly-loopは幾分複雑です:
(defun silly-loop (n)
"Return time before and after N iterations of a loop."
(let ((t1 (current-time-string)))
(while (> (setq n (1- n))
0))
(list t1 (current-time-string))))
⇒ silly-loop
(disassemble 'silly-loop)
-| byte-code for silly-loop:
doc: Return time before and after N iterations of a loop.
args: (n)
0 constant current-time-string ; current-time-stringを
; スタック上のトップにpushする。
1 call 0 ; 引数なしでcurrent-time-stringを呼び出し
; 結果をスタック上にpushする。
2 varbind t1 ; スタックをpopしてt1にpopされた値をバインドする。
3:1 varref n ; 環境からnの値を取得して
; その値をスタック上にpushする。
4 sub1 ; スタックのトップから1を減ずる。
5 dup ; スタックのトップを複製する。 ; たとえばスタックのトップをコピーしてスタック上にpushする。 6 varset n ; スタックのトップをpopして ;nをその値にバインドする。 ;; (要はシーケンスdup varsetはpopせずに ;; スタックのトップをnの値にコピーする。)
7 constant 0 ; スタック上に0をpushする。 8 gtr ; スタックのトップ2値をpopして取り出し ; nが0より大かテストし ; 結果をスタック上にpushする。
9 goto-if-not-nil 1 ; n > 0なら1へ
; (これはwhile-loopを継続する)
; それ以外はcontinue。
12 varref t1 ;t1の値をスタック上にpushする。 13 constant current-time-string ;current-time-stringを ; スタックのトップにpushする。 14 call 0 ; 再度current-time-stringを呼び出す。
15 unbind 1 ; ローカル環境のt1をアンバインドする。
16 list2 ; スタックのトップ2要素をpopして取り出し
; それらのリストを作りスタック上にpushする。
17 return ; スタックのトップの値をリターンする。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lispプログラム内の問題を見つけて詳細に調べる方法が、いくつかあります。
入出力の問題をデバックする便利なその他のツールに、ドリブルファイル(dribble file: Terminal Inputを参照)と、open-termscript関数(Terminal Output)があります。
| 17.1 The Lisp Debugger | Emacs Lisp評価機能にたいするデバッガ。 | |
| 17.2 Edebug | Emacs Lispソースレベルデバッガ。 | |
| 17.3 Debugging Invalid Lisp Syntax | シンタックスエラーを見つける方法。 | |
| 17.4 Test Coverage | プログラムのすべての分岐を確実にテストする。 | |
| 17.5 Profiling | あなたのコードが使用するリソースの計測。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
普通のLispデバッガは、フォーム評価のサスペンド機能を提供します。評価がサスペンド(一般的にはbreakの状態として知られる)されている間、実行時スタックを調べたり、ローカル変数やグローバル変数の値を調べたり変更することができます。breakは再帰編集(recursive edit)なので、Emacsの通常の編集機能が利用可能です。デバッガにエンターするようにプログラムを実行することさえ可能です。Recursive Editingを参照してください。
| 17.1.1 Entering the Debugger on an Error | エラー発生時にデバッガにエンターする。 | |
| 17.1.2 Debugging Infinite Loops | exitしないプログラムの停止デバッグ。 | |
| 17.1.3 Entering the Debugger on a Function Call | 特定の関数が呼び出されたときにデバッガにエンターする。 | |
| 17.1.4 Explicit Entry to the Debugger | プログラム内の特定箇所でデバッガにエンターする。 | |
| 17.1.5 Using the Debugger | デバッガが行なうこと: そこで何を目にするか。 | |
| 17.1.6 Debugger Commands | デバッガで使用するコマンド。 | |
| 17.1.7 Invoking the Debugger | 関数debugの呼び出し方。
| |
| 17.1.8 Internals of the Debugger | デバッガのサブルーチン、およびグローバル変数。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
デバッガに入る一番重要なタイミングは、Lispエラーが発生したときです。デバッガでは、エラーの直接原因を調査できます。
しかしデバッガへのエンターは、エラーによる通常の結末ではありません。多くのコマンドは不適切に呼び出されたときにLispエラーをシグナルするので、通常の編集の間にこれが発生するたびデバッガにエンターするのは、とても不便でしょう。したがって、エラーの際にデバッガにエンターしたい場合は、変数debug-on-errorに非nilをセットします。(コマンドtoggle-debug-on-errorは、これを簡単に行う方法を提供します。)
この変数はエラーがシグナルされ、それがハンドルされていないときに、デバッガが呼び出されるかどうかを決定します。debug-on-errorがtの場合は、debug-ignored-errors(以下を参照)にリストされているエラーを除く、すべての種類のエラーがデバッガを呼び出します。nilの場合は、デバッガを呼び出しません。
値にはエラー条件(How to Signal an Errorを参照)のリストも指定できます。その場合、このリスト内のエラー条件だけにより、デバッガが呼び出されます(debug-ignored-errorsにもリストされているエラー条件は除外されます)。たとえば、debug-on-errorをリスト(void-variable)にセットした場合には、値をもたない変数に関するエラーにたいしてだけデバッガが呼び出されます。
eval-expression-debug-on-errorがこの変数をオーバーライドする場合がいくつかあることに注意してください(以下を参照)。
この変数が非nilのとき、Emacsはプロセスフィルター関数と番兵(sentinel)の周囲にエラーハンドラーを作成しません。したがって、これらの関数内でのエラーは、デバッガを呼び出します。Processesを参照してください。
この変数は、debug-on-errorの値に関わらず、デバッガにエンターすべきでないエラーを指定します。変数の値はエラー条件のシンボル、および/または正規表現のリストです。エラーがこれら条件シンボルのいずれか、またはエラーメッセージが正規表現のいずれかにマッチする場合、そのエラーはデバッガにエンターしません。
この変数の通常の値にはuser-errorと、同様に編集中にしばしば発生するがLispプログラムのバグによるものはほとんどない、いくつかのエラーが含まれます。しかし、“ほとんどない”は“絶対ない”ではありません。あなたのプログラムがこのリストにマッチするエラーにより機能しない場合は、そのエラーをデバッグするために、このリストの変更を試みるのもよいでしょう。通常はdebug-ignored-errorsをnilにセットしておくのが、もっとも簡単な方法です。
この変数が非nil値(デフォルト)の場合は、コマンドeval-expressionの実行により、一時的にdebug-on-errorがtがバインドされます。Evaluating Emacs-Lisp Expressions in The GNU Emacs
Manualを参照してください。
eval-expression-debug-on-errorがnilの場合は、eval-expressionの間もdebug-on-errorの値は変更されません。
condition-caseによりキャッチされたエラーは通常、決してデバッガを呼び出しません。condition-caseは、デバッガがそのエラーをハンドルする前に、エラーをハンドルする機会を得ます。
debug-on-signalを非nil値に変更した場合は、condition-caseの存在如何に関わらず、すべてのエラーにおいてデバッガが最初に機会を得ます。(デバッガを呼び出すためには、依然としてそのエラーがdebug-on-errorとdebug-ignored-errorsで指定された条件を満たさなければなりません。)
警告:
この変数を非nilにセットすると、芳しくない効果があるかもしれません。Emacsのさまざまな部分で処理の通常の過程としてエラーがキャッチされており、そのエラーが発生したことに気づかないことさえあるかもしれません。condition-caseでラップされたコードをデバッグする必要がある場合は、condition-case-unless-debug(see section Writing Code to Handle Errorsを参照)の使用を考慮してください。
debug-on-eventをスペシャルイベント(Special Eventsを参照)にセットした場合は、Emacsはspecial-event-mapをバイパスして、このイベントを受け取ると即座にデバッガへのエンターを試みます。現在のところサポートされる値は、シグナルSIGUSR1およびSIGUSR2に対応する値だけです(これがデフォルトです)。これはinhibit-quitがセットされていて、それ以外はEmacsが応答しない場合に有用かもしれません。
debug-on-messageに正規表現をセットした場合には、それにマッチするメッセージがエコーエリアに表示されると、Emacsはデバッガにエンターします。たとえば、これは特定のメッセージの原因を探すのに有用かもしれません。
initファイルロード中に発生したエラーをデバッグするには、オプション‘--debug-init’を使用します。これはinitファイルロードの間にdebug-on-errorをtにバインドして、通常はinitファイル内のエラーをキャッチするcondition-caseをバイパスします。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
プログラムが無限にループしてリターンできないとき、最初の問題はそのループをいかに停止するかです。ほとんどのオペレーティングシステムでは、(quitさせる)C-gでこれを行うことができます。Quittingを参照してください。
普通のquitでは、なぜそのプログラムがループしたかについての情報は与えられません。変数debug-on-quitに非nilをセットすることにより、より多くの情報を得ることができます。無限ループの途中でデバッガを実行すれば、デバッガからステップコマンドで先へ進むことができます。ループ全体をステップで追えば、問題を解決するために十分な情報が得られるでしょう。
C-gによるquitはエラーとは判断されないので、C-gのハンドルにdebug-on-errorは効果がありません。同じように、debug-on-quitはエラーにたいして効果がありません。
この変数は、quitがシグナルされ、それがハンドルされていないときに、デバッガを呼び出すかどうかを決定します。debug-on-quitが非nilの場合は、quit(つまりC-gをタイプ)したときは常にデバッガが呼び出されます。debug-on-quitがnil(デフォルト)の場合は、quitしてもデバッガは呼び出されません。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
プログラムの途中で発生する問題を調べるための有用なテクニックの1つは、特定の関数が呼び出されたときデバッガにエンターする方法です。問題が発生した関数にこれを行い、その関数をステップで追ったり、問題箇所の少し手前の関数呼び出しでこれを行い、その関数をステップオーバーしてその後をステップで追うことができます。
この関数は、function-nameが呼び出されるたびにデバッガの呼び出しを要求します。
Lispコードで定義された任意の関数およびマクロは、インタープリターに解釈されたコードかコンパイル済みのコードかに関わらず、エントリーにbreakをセットできます。その関数がコマンドの場合は、Lispから呼び出されたときと、インタラクティブに呼び出されたとき、デバッガにエンターします。(たとえばCで記述された)プリミティブ関数にも、この方法でdebug-on-entryをセットできますが、そのプリミティブがLispコードから呼び出されたときだけ効果があります。debug-on-entryはスペシャルフォームにはセットできません。
debug-on-entryがインタラクティブに呼び出されたときは、ミニバッファーでfunction-nameの入力を求めます。その関数がすでにエントリーでデバッガを呼び出すようにセットアップされていた場合、debug-on-entryは何も行いません。debug-on-entryは常にfunction-nameをリターンします。
以下は、この関数の使い方を説明するための例です:
(defun fact (n)
(if (zerop n) 1
(* n (fact (1- n)))))
⇒ fact
(debug-on-entry 'fact)
⇒ fact
(fact 3)
------ Buffer: *Backtrace* ------ Debugger entered--entering a function: * fact(3) eval((fact 3)) eval-last-sexp-1(nil) eval-last-sexp(nil) call-interactively(eval-last-sexp) ------ Buffer: *Backtrace* ------
この関数はfunction-nameにたいするdebug-on-entryの効果をアンドゥします。インタラクティブに呼び出されたときは、ミニバッファーでfunction-nameの入力を求めます。function-nameが省略された、あるいはnilの場合は、すべての関数にたいするbreak-on-entryをキャンセルします。エントリー時にbreakするようセットアップされていない関数にcancel-debug-on-entryを呼び出したときは、何も行いません。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
プログラム内の特定箇所に式(debug)を記述することにより、その箇所でデバッガが呼び出されるようにできます。これを行うにはソースファイルをvisitして、適切な箇所にテキスト‘(debug)’を挿入し、C-M-x(Lispモードでのeval-defunにたいするキーバインド)をタイプします。警告:
一時的なデバッグ目的のためにこれを行なう場合は、ファイルを保存する前に確実にアンドゥしてください!
‘(debug)’を挿入する箇所は、追加フォームが評価されることができ、その値を無視することができる箇所でなければなりません。(‘(debug)’の値が無視されない場合が、プログラムの実行が変更されてしまうでしょう!)
一般的にもっとも適した箇所は、prognまたは暗黙的なprogn(Sequencingを参照)の内部です。
デバッグ命令を配したいソースコード中の正確な箇所がわからないが、特定のメッセージが表示されたときにバックトレースを表示したい場合は、意図するメッセージにマッチする正規表現をdebug-on-messageにセットできます。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
デバッガにエンターすると、その前に選択されていたウィンドウを1つのウィンドウに表示し、他のウィンドウに*Backtrace*という名前のバッファーを表示します。backtraceバッファーには、現在実行されているLisp関数の各レベルが1行ずつ含まれます。このバッファーの先頭は、デバッガが呼び出された理由を説明するメッセージ(デバッガがエラーにより呼び出された場合はエラーメッセージや関連するデータなど)です。
backtraceバッファーは読み取り専用で、文字キーにデバッガコマンドが定義されたDebuggerモードという特別なメジャーモードを使用します。通常のEmacs編集コマンドが利用できます。したがって、エラー時に編集されていたバッファーを調べるためにウィンドウを切り替えたり、バッファーを切り替えやファイルのvisit、その他一連の編集処理を行なうことができます。しかしデバッガは再帰編集レベル(Recursive Editingを参照)にあり、編集が終わったらそれはbacktraceバッファーに戻って、(qコマンドで)デバッガをexitできます。デバッガをexitすることにより、再帰編集を抜け出し、backtraceバッファーはバリー(bury:
覆い隠す)されます。(変数debugger-bury-or-killwをセットすることにより、backtraceバッファーでqコマンドが何を行うかをカスタマイズできます。たとえば、バッファーをバリーせずにkillしたい場合は、この変数をkillにセットします。他の値については、変数のドキュメントを調べてください。)
デバッガにエンターしたとき、eval-expression-debug-on-errorに一致するように変数debug-on-errorが一時的にセットされます。変数eval-expression-debug-on-errorが非nilの場合、debug-on-errorは一時的にtにセットされます。これは、デバッグセッション行っている間にさらにエラーが発生すると、(デフォルトでは)他のbacktraceがトリガーされることを意味します。これが望ましくない場合は、debugger-mode-hook内でeval-expression-debug-on-errorをnilにセットするか、debug-on-errorをnilにセットすることができます。
backtraceバッファーは、実行されている関数と、その関数の引数の値を示します。しのフレームを示す行にポイントを移動して、スタックフレームを指定することもできます。(スタックフレームとは、Lispインタープリターがある関数への特定の呼び出しを記録する場所のことです。) 行ポイントがオンのフレームが、カレントフレーム(current frame)となります。デバッガコマンドのいくつかは、カレントフレームを処理します。ある行がスター(star)で始まる場合は、そのフレームをexitすることにより再びデバッガが呼び出されることを意味します。これは関数のリターン値を調べるとき有用です。
関数名にアンダーラインが引かれている場合は、デバッガがその関数のソースコードも位置を知っていることを意味します。その名前をマウスでクリックするか、そこに移動してRETをタイプして、ソースコードをvisitできます。
デバッガはデバッガ自身のスタックフレーム数を想定するため、バイトコンパイルされて実行されなければなりません。デバッガがインタープリターに解釈されて実行されているとき、これらの想定は正しくなくなります。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
(Debuggerモードの)debuggerバッファーでは、通常のEmacsコマンドに加えて、特別なコマンドが提供されます。デバッガでもっとも重要な使い方をするのは、制御フローを見ることができるコードをステップ実行するコマンドです。デバッガはインタープリターにより解釈された制御構造のステップ実行はできますが、バイトコンパイル済みの関数ではできません。バイトコンパイル済み関数をステップ実行したい場合は、同じ関数の解釈された定義に置き換えてください。(これを行なうには、その関数のソースをvisitして、関数の定義でC-M-xとタイプしてください。) プリミティブ関数のステップ実行にLispデバッガは使用できません。
以下はDebuggerモードのコマンドのリストです:
デバッガをexitして、実行を継続する。これはあたかもデバッガにエンターしなかったかのように(デバッガ内で行った変数値やデータ構造の変更などの副作用は除外される)、プログラムの実行を再開する。
実行を継続するが、次にLisp関数が何か呼び出されたときはデバッガにエンターする。これにより、ある式の下位の式をステップ実行して、下位の式が計算する値や、行うことを確認できる。
デバッガにエンターした関数呼び出しにたいして、この方法で作成されたスタックフレームには自動的にフラグがつくので、そのフレームをexitすると再びデバッガが呼び出されます。このフラグは、uコマンドを使用してキャンセルできます。
カレントフレームにフラグをつけるので、そのフレームをexitするときデバッガにエンターする。この方法でフラグがつけられたフレームは、backtraceバッファーでスターのマークがつく。
カレントフレームをexitしたとき、デバッガにエンターしてはならない。これは、そのフレームのbコマンドをキャンセルする。目に見える効果としては、backtraceバッファーの行からスターが削除される。
bと同じようにカレントフレームにフラグをつける。その後、cのように実行を継続するが、debug-on-entryによりセットアップされたすべての関数にたいするbreak-on-entryを一時的に無効にする。
ミニバッファーのLisp式を読み取り、(関連するlexical環境が適切なら)評価して、エコーエリアに値をプリントする。デバッガは特定の重要な変数とバッファーを処理の一部としてを変更する。eは一時的にデバッガの外部からそれらの値をリストアするので、それらを調べて変更できる。これによりデバッガはより透過的になる。対照的に、デバッガ内でM-:は特別なことを行わず、デバッガ内での変数の値を表示する。
eと同様だが、バッファー*Debugger-record*内の評価の結果も保存する。
デバッグされているプログラムを終了し、Emacsコマンド実行のトップレベルにリターンする。
C-gによりデバッガにエンターしたが、実際はデバッグではなくquitしたいときは、qコマンドを使用する。
デバッガから値をリターンする。ミニバッファーで式を読み取り、それを評価することにより、値が計算される。
dコマンドは、(bによるリクエスト、またはdによるそのフレームへのエンターによる)Lisp呼び出しフレームからのexitでデバッガが呼び出されたときに有用です。rコマンドで指定された値は、そのフレームの値として使用されます。これは、debugを呼び出して、そのリターン値を使用するときも有用です。それ以外は、rはcと同じ効果をもyい、指定されたリターン値は問題になりません。
エラーによりデバッガにエンターしたときは、rコマンドは使用できません。
呼び出されたときにデバッガを呼び出す関数をリストします。これは、debug-on-entryによりエントリー時にbreakするようセットされた関数のリストです。
カレントスタックフレームのローカル変数の表示を切り替えます。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下では、デバッガを呼び出すために使用される関数debugの完全な詳細を説明します。
この関数は、デバッガにエンターします。この関数は*Backtrace*(デバッガへの2回目以降の再帰エントリーでは*Backtrace*<2>、...)という名前のバッファーにバッファーを切り替えて、Lisp関数呼び出しについての情報を書き込みます。それから再帰編集にエンターして、Debuggerモードでbacktraceバッファーを表示します。
Debuggerモードのコマンドc、d、j、rは再帰編集をexitします。その後、debugは以前のバッファーに戻って、debugを呼び出したものが何であれ、そこにリターンします。これは関数debugが呼び出し元にリターン可能な唯一の方法です。
debugger-argsを使用すると、debugは*Backtrace*の最上部に残りの引数を表示するもで、ユーザーがそれらを確認できます。以下で説明する場合を除き、これは、これらの引数を使用する唯一の方法です。
しかしdebugへの1つ目の引数にたいする値は、特別な意味をもちます。(これらの値は通常、debugを呼び出すプログラマーではなく、Emacs内部でのみ使用されます。)
以下はこれら特別な値のテーブルです:
lambda1つ目の引数galambdaの場合、それはdebug-on-next-callが非nilのときに関数にエントリーしたことによりdebugが呼び出されたことを意味する。デバッガはバッファーのトップのテキスト行に‘Debugger
entered--entering a function:’と表示する。
debug1つ目の引数がdebugの場合、それはエントリー時にデバッグされるようにセットされた関数にエントリーしたことによりdebugが呼び出されたことを意味する。デバッガはlambdaのときと同様、‘Debugger
entered--entering a
function:’を表示します。これはその関数のスタックフレームもマークするので、exit時にデバッガが呼び出される。
t1つ目の引数がtの場合、それはdebug-on-next-callが非nilのときに関数呼び出しの評価によりdebugが呼び出されたことを示す。デバッガはバッファーのトップの行に‘Debugger
entered--beginning evaluation of function call form:’と表示する。
exit1つ目の引数がexitのときは、exit時にデバッガを呼び出すよう以前にマークされたスタックフレームをexitしたことを示す。この場合は、debugに与えられた2つ目の引数が、そのフレームからリターンされた値になる。デバッガはバッファーのトップの行に‘Debugger
entered--returning value:’とリターンされた値を表示する。
error1つ目の引数がerrorのときは、ハンドルされていないエラーまたはquitがシグナルされてデバッガにエンターした場合で、デバッガは‘Debugger
entered--Lisp error:’とその後にシグナルされたエラーおよびsignalへの引数を表示して、それを示す。たとえば、
(let ((debug-on-error t)) (/ 1 0))
------ Buffer: *Backtrace* ------ Debugger entered--Lisp error: (arith-error) /(1 0) ... ------ Buffer: *Backtrace* ------
エラーがシグナルされた場合はおそらく、変数debug-on-errorは非nilで、quitがシグナルされた場合はおそらく、変数debug-on-quitは非nilである。
nil明示的にデバッガにエンターしたいときは、debugger-argsの1つ目の引数にnilを使用する。残りのdebugger-argsは、バッファーのトップの行にプリントされる。メッセージ
— たとえばdebugが呼び出された条件を思い出すためのリマインダー — の表示にこの機能を使用できる。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、デバッガ内部で使用される関数と変数について説明します。
この関数の値は、デバッガを呼び出す関数呼び出しです。値には任意個の引数をとる関数、より具体的には関数の名前でなければなりません。この関数は何らかのデバッガを呼び出すべきです。この変数のデフォルト値はdebugです。
関数にたいしてLispが渡す1つ目の引数は、その関数がなぜ呼び出されたかを示します。引数の慣習は、debug(Invoking the Debugger)に詳解されています。
この関数は現在アクティブなLisp関数呼び出しのトレースをプリントします。この関数はdebugが*Backtrace*バッファーに書き込む内容を得るために使用されます。どの関数呼び出しがアクティブか判断するためにスタックにアクセスしなければならないので、この関数はCで記述されています。リターン値は、常にnilです。
以下の例では、Lisp式で明示的にbacktraceを呼び出しています。これはストリームstandard-output(この場合はバッファー‘backtrace-output’)にbacktraceをプリントします。
backtraceの各行は、1つの関数呼び出しを表します。関数の引数が既知の場合は行に値が表示され、まだ計算中の場合は行にその旨が示されます。スペシャルフォームの引数は無視されます。
(with-output-to-temp-buffer "backtrace-output"
(let ((var 1))
(save-excursion
(setq var (eval '(progn
(1+ var)
(list 'testing (backtrace))))))))
⇒ (testing nil)
----------- Buffer: backtrace-output ------------ backtrace() (list ...computing arguments...)
(progn ...) eval((progn (1+ var) (list (quote testing) (backtrace)))) (setq ...) (save-excursion ...) (let ...) (with-output-to-temp-buffer ...) eval((with-output-to-temp-buffer ...)) eval-last-sexp-1(nil)
eval-last-sexp(nil) call-interactively(eval-last-sexp) ----------- Buffer: backtrace-output ------------
この変数が非nilの場合、それは次のeval、apply、funcallの前にデバッガを呼び出すよう指定します。デバッガへのエンターにより、debug-on-next-callはnilにセットされます。
デバッガのdコマンドは、この変数をセットすることにより機能します。
この関数は、そのスタックフレームのlevel下位のスタックフレームのdebug-on-exitフラグにflagに応じた値をセットします。flagが非nilの場合は、後にそのフレームをexitするときデバッガにエンターします。そのフレームを通じた非ローカルexitでも、デバッガにエンターします。
この関数は、デバッガだけに使用されます。
この変数はカレントのインタラクティブコマンドのデバッグ状態を記録します。コマンドがインタラクティブに呼び出されるたびに、この変数はnilにバインドされます。デバッガは、同じコマンドが呼び出されたときのデバッガ呼び出しに情報を残すために、この変数をセットできます。
普通のグローバル変数ではなくこの変数を使用する利点は、そのデータが後続のコマンド呼び出しに決して引き継がれないことです。
関数backtrace-frameは、Lispデバッガ内での使用を意図しています。これは、frame-numberレベル下位のスタックフレームで、何の評価が行われているかに関する情報をリターンします。
そのフレームがまだ引数を評価していない場合、またはそのフレームがスペシャルフォームの場合、値は(nil function
arg-forms…)です。
そのフレームが引数を評価して関数をすでに呼び出した場合、リターン値は(t function
arg-values…)です。
リターン値のfunctionは何であれ評価されたリストのCARとして提供されます。マクロ呼び出しの場合はlambda式になります。その関数に&rest引数がある場合は、リストarg-valuesの末尾に表されます。
frame-numberが範囲外の場合、backtrace-frameはnilをリターンします。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
EdebugはEmacs Lispプログラムにたいするソースレベルデバッガです。これにより、以下のことができます:
以下の初めの3つのセクションは、使用を開始するためにEdebugについて十分説明します。
| 17.2.1 Using Edebug | Edebug使用のための手引き。 | |
| 17.2.2 Instrumenting for Edebug | Edebugでデバッグするために、コードをインストルメント(計装)しなければならないe | |
| 17.2.3 Edebug Execution Modes | 多かれ少なかれ、ストップする実行モード。 | |
| 17.2.4 Jumping | 特定の位置にジャンプするコマンド。 | |
| 17.2.5 Miscellaneous Edebug Commands | さまざまなコマンド。 | |
| 17.2.6 Breaks | プログラムをストップさせるbreakpointのセット。 | |
| 17.2.7 Trapping Errors | Edebugでのエラーのトラップ。 | |
| 17.2.8 Edebug Views | Edebugの内側と外側のビュー。 | |
| 17.2.9 Evaluation | Edebugでの式の評価。 | |
| 17.2.10 Evaluation List Buffer | Edebugにエンターするたびに値が表示される式。 | |
| 17.2.11 Printing in Edebug | プリントのカスタマイズ。 | |
| 17.2.12 Trace Buffer | バッファー内で採れを生成する方法。 | |
| 17.2.13 Coverage Testing | 評価をカバレッジテストする方法。 | |
| 17.2.14 The Outside Context | Edebugが保存およびリストアするデータ。 | |
| 17.2.15 Edebug and Macros | マクロ呼び出しをハンドルする方法の指定。 | |
| 17.2.16 Edebug Options | Edebugをカスタマイズするオプション変数。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
EdebugでLispプログラムをデバッグするには、最初にデバッグしたいLispコードをインストルメント(instrument:
計装)しなければなりません。これを行なうもっともシンプルな方法は、関数またはマクロの定義に移動して、C-u
C-M-x(プレフィクス引数を指定したeval-defun)を行います。コードをインストルメントする他の手段については、Instrumenting for Edebugを参照してください。
一度関数をインストルメントすると、その関数にたいする任意の呼び出しにより、Edebugがアクティブになります。Edebugがアクティブになると、どのEdebug実行モードを選択したかに依存して、その関数をステップ実行できるように実行がストップされるか、ディスプレイを更新してデバッグコマンドにたいするチェックの間、実行が継続されます。デフォルトの実行モードstepで、これは実行をストップします。Edebug Execution Modesを参照してください。
Edebugでは通常、デバッグしているLispコードをEmacsバッファーで閲覧します。これをソースコードバッファー(source code buffer)と呼び、バッファーは一時的に読み取り専用になります。
左フリンジの矢印は、その関数で実行されている行を示します。最初ポイントはその関数の実行されている行にありますが、ポイントを移動するとこれは真ではなくなります。
以下は、facの定義(以下を参照)をインストルメントして(fac
3)を実行した場合に通常目にするものです。ポイントは、ifの前の開きカッコにあります。
(defun fac (n)
=>∗(if (< 0 n)
(* n (fac (1- n)))
1))
関数内でEdebugが実行をストップできる位置のことを、ストップポイント(stop
points)と呼びます。ストップポイントは、リストであるような部分式の前後、および変数参照の後でも発生します。以下は、関数fac内のストップポイントをピリオドで示したものです:
(defun fac (n)
.(if .(< 0 n.).
.(* n. .(fac .(1- n.).).).
1).)
Emacs
Lispモードのコマンドに加えて、ソースコードバッファーでは、Edebugのスペシャルコマンドが利用できます。たとえば、EdebugコマンドSPCで次のストップポイントまで実行することができます。facにエントリーした後に一度facとタイプした場合は、以下のように表示されるでしょう:
(defun fac (n)
=>(if ∗(< 0 n)
(* n (fac (1- n)))
1))
式の後でEdebugが実行をストップしたときは、エコーエリアにその式の値が表示されます。
他にも頻繁に使用されるコマンドとして、ストップポイントにbreakpointをセットするb、breakpointに達するまで実行するg、Edebugをexitしてトップレベルのコマンドループにリターンするqがあります。また、?とタイプするとすべてのEdebugコマンドがリストされます。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
LispコードのデバッグにEdebugを使用するためには、最初にそのコードをインストルメント(instrument: 計装)しなければなりません。コードをインストルメントすると、適切な位置でEdebugを呼び出すために追加コードが挿入されます。
関数定義でプレフィクス引数とともにコマンドC-M-x
(eval-defun)を呼び出すと、それを評価する前にその定義をインストルメントします。(ソースコード自体は変更しません。)
変数edebug-all-defsが非nilの場合は、プレフィクス引数の意味を反転します。この場合、C-M-xはプレフィクス引数がなければその定義をインストルメントします。edebug-all-defsのデフォルト値はnilです。コマンドM-x
edebug-all-defsは、変数edebug-all-defsの値を切り替えます。
edebug-all-defsが非nilの場合はeval-region、eval-current-buffer、eval-bufferも、それらが評価する定義をインストルメントします。同様に、edebug-all-formsは、eval-regionが(非定義フォームさえ含む)あらゆるフォームをインストルメントすべきかを制御します。これはミニバッファー内でのロードや評価には適用されません。コマンドM-x
edebug-all-formsは、このオプションを切り替えます。
他にもコマンドM-x
edebug-eval-top-level-formが利用可能で、これはedebug-all-defsやedebug-all-formsの値に関わらず、トップレベルの任意のフォームをインストルメントします。edebug-defunはedebug-eval-top-level-formのエイリアスです。
Edebugがアクティブのの間、コマンドI(edebug-instrument-callee)は、ポイント後のリストフォームに呼び出される関数およびマクロ定義がまだインストルメントされていなければ、それらをインストルメントします。これは、そのファイルのソースの場所をEdebugが知っている場合だけ可能です。この理由によりEdebugロード後は、たとえ評価する定義をインストルメントしない場合でも、eval-regionは評価するすべての定義の位置を記録します。インストルメント済み関数呼び出しにステップインするiコマンド(Jumpingを参照)も参照してください。
Edebugはすべての標準スペシャルフォーム、式引数をもつinteractiveフォーム、無名ラムダ式、およびその他の定義フォームのインストルメント方法を知っています。しかし、Edebugはユーザー定義マクロが引数にたいして何を行うかを判断できないので、Edebug仕様を使用してその情報を与えなければなりません。詳細はEdebug and Macrosを参照してください。
Edebugがセッション内で最初にコードをインストルメントしようとするときは、フックedebug-setup-hookを実行してから、それにnilをセットします。使おうとしているパッケージに結びつけてEdebug仕様をロードするためにこれを使用できますが、それはEdebugを使用するときだけ機能します。
定義からインストルメントを削除するには、単にインストルメントを行わない方法でその定義を再評価するだけです。フォームを絶対にインストルメントせずに評価するには、2つの方法があります。それはファイルからのloadによる評価と、ミニバッファーからのeval-expression(M-:)による評価です。
Edebugがインストルメント中にシンタックスエラー(syntax error:
構文エラー)を検知した場合は、間違ったコードの箇所にポイントを残してinvalid-read-syntaxエラーをシグナルします。
Edebug内で利用可能な他の評価関数については、Evaluationを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Edebugは、デバッグするプログラムの実行にたいして、いくつかの実行モードをサポートします。これらの実行モードを、Edebug実行モード(Edebug execution modes)と呼びます。これらをメジャーモードやマイナーモードと混同しないでください。カレントのEdebug実行モードは、プログラムをストップする前にEdebugがどれだけ実行を継続するか — たとえばストップポイントごとにストップ、あるいは次のbreakpointまで継続など — と、ストップする前にEdebugがどれだけ進捗を表示するかを決定します。
Edebug実行モードは通常、ある特定のモードでプログラムを継続させるコマンドをタイプすることにより指定します。以下は、それらのコマンドのテーブルです。プログラムの実行を再開S以外は、少なくともある長さの間だけ実行を継続します。
Stop(ストップ): これ以上プログラムを実行しないで、Edebugのコマンドを待つ(edebug-stop)。
Step(ステップ): 次のストップポイントでストップする(edebug-step-mode)。
Next(次へ):
式の後にある次のストップポイントでストップする(edebug-next-mode)。Jumpingのedebug-forward-sexpも参照。
Trace(トレース): Edebugのストップポイントごとにpause(通常は1秒)する(edebug-trace-mode)。
Rapid
trace(高速でトレース):ストップポイントごとに表示を更新するが、実際にpauseはしない(edebug-Trace-fast-mode)。
Go(進む): 次のbreakpointまで実行する(edebug-go-mode)。Edebug Breakpointsを参照。
Continue(継続): breakpointごとにpauseしてから継続する(edebug-continue-mode)。
Rapid continue(高速で継続):
ポイントを各breakpointへ移動するが、pauseしない(edebug-Continue-fast-mode)。
Go non-stop(ストップせず進む):
breakpointを無視する(edebug-Go-nonstop-mode)。まだS、またはその他の編集コマンドでプログラムをストップするのは可能。
一般的に、上記リストの最初のほうにある実行モードは後のほうの実行モードに比べて、プログラムをより低速に実行、またはすぐにストップさせます。
実行中、またはトレース中は、任意のEdebugコマンドをタイプすることにより、実行をインタラプト(interrupt: 中断、割り込み)できます。Edebugは次のストップポイントでプログラムをストップしてから、タイプされたコマンドを実行します。たとえば、実行中にtをタイプすると、次のストップポイントでトレースモードに切り替えます。Sを使用すれば、他に何も行わずに実行をストップできます。
関数でたまたま読み取り入力が発生した場合には、実行のインタラプトを意図してタイプされた文字は、かわりにその関数により読み取られます。そのプログラムが入力を欲するタイミングに注意を払うことで、そのような意図せぬ結果を避けることができます。
このセクションのコマンドを含むキーボードマクロは、完全には機能しません。プログラムを再開するためにEdebugからexitすると、キーボードマクロの追跡記録は失われます。これを処理するのは、簡単ではありません。またEdebug外部でキーボードマクロを定義または実行しても、Edebug内部のコマンドに影響しません。通常これは利点です。Edebug Options内のedebug-continue-kbd-macroオプションも参照してください。
新たなEdebugレベルにエンターしたとき、初期の実行モードは変数edebug-initial-modeの値により与えられます(Edebug Optionsを参照)。デフォルトでこれはstepモードを指定します。たとえば1つのコマンドからインストルメント済みの関数が複数回呼び出された場合は、同じEdebugレベルに再エンターするかもしれないことに注意してください。
このオプションは、traceモードおよびcontinueモードで実行ステップの間を何秒待つか指定します。デフォルトは1秒です。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションで説明するコマンドは、指定された場所に達するまで実行を続けます。iを除くすべてのコマンドは、ストップ場所を確立するために一時的なbreakpointを作成してから、goモードにスイッチします。意図されたストップポイントの前にある他のストップポイントに達した場合も、実行はストップします。breakpointの詳細は、Edebug Breakpointsを参照してください。
これらのコマンドは、非ローカルexitの場合はプログラムのストップを期待する一時的なbreakpointをバイパスできるので、期待どおり機能しないかもしれません。
ポイントがある場所の近くのストップポイントへ実行を進める(edebug-goto-here)。
プログラムの式を1つ分実行する(edebug-forward-sexp)。
sexpを含む終端までプログラムを実行する(edebug-step-out)。
ポイントの後のフォームから呼び出された関数またはマクロにステップインする(edebug-step-in)。
hコマンドは一時的なbreakpointを使用して、ポイントのカレント位置、またはその後のストップポイントまで処理を進めます。
fコマンドは式を1つ飛び越してプログラムを実家します。より正確には、forward-sexpにより到達できる位置に一時的なbreakpointをセットしてからgoモードで実行するので、プログラムはそのbreakpointでストップすることになります。
プレフィクス引数nとともに使用した場合は、ポイントからn個のsexp(s-expression: S式)を超えた場所に一時的なbreakpointをセットします。ポイントを含むリストがnより少ない要素で終わるような場合は、ストップ箇所はポイントが含まれる式の後になります。
forward-sexpが見つける位置と、プログラムを実際にストップさせたい位置なのかチェックしなければなりません。たとえばcond内では、これは正しくないかもしれません。
fコマンドは柔軟性を与えるために、forward-sexpをストップポイントではなく、ポイント位置から開始します。カレントのストップポイントから1つの式を実行したい場合は、まずそこにポイントを移動するためにw(edebug-where)をタイプして、それからfをタイプしてください。
oコマンドは、式の“外側”で実行を継続します。これは、ポイントを含む式の最後に一時的なbreakpointを配します。ポイントを含むsexpが関数定義の場合、oはその定義内の最後のsexpの直前まで実行を継続します。もし定義内の最後のsexpの直前にポイントがある場合は、その関数からリターンしてからストップします。他の言い方をすると、このコマンドは最後のsexpの後にポイントがない場合は、カレントで実行中の関数からexitしません。
iコマンドは、ポイントの後のリストフォームに呼び出された関数、またはマクロにステップインします。そのフォームは、評価されようとしているもの1つである必要はないことに注意してください。しかし、そのフォームが評価されようとしている関数呼び出しの場合は、引数が何も評価されないうちにこのコマンドを使用しないと、遅すぎることを覚えておいてください。
iコマンドは、ステップインしようとしている関数またはマクロがまだインストルメントされていない場合は、それらをインストルメントします。これは便利かもしれませんが、それらを明示的に非インストルメントしない場合、その関数またはマクロはインストルメントされたままになることを覚えておいてください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ここでは、その他のEdebugコマンドを説明します。
Edebugのヘルプメッセージを表示する(edebug-help)。
1レベルを中断して以前のコマンドレベルへ戻る(abort-recursive-edit)。
エディターのトップレベルのコマンドループにリターンする(top-level)。これは、すべてのレベルのEdebugアクティビティを含む、すべての再帰編集レベルをexitする。しかし、フォームunwind-protectまたはcondition-caseで保護されたインストルメント済みのコードはデバッグを再開するかもしれない。
qと同様だが、保護されたコードでもストップしない(edebug-top-level-nonstop)。
エコーエリアに、もっとも最近の既知のコマンドを再表示する(edebug-previous-result)。
backtraceを表示するが、明確であるようにEdebug自身の関数は除外される(edebug-backtrace)。
Edebugのbacktraceバッファーでは、標準デバッガ内のようにバッガコマンドは使用できない。
実行を継続したとき、backtraceバッファーは自動的にkillされる。
Edebugから再帰的にEdebugをアクティブにするコマンドを呼び出すことができます。Edebugがアクティブなときは常に、qによトップレベルの終了、またはC-]による再帰編集1レベルの中断ができます。dにより、すべての未解決な評価のbacktraceを表示できます。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Edebugのstepモードは、次のストップポイントに達したときに、実行をストップします。一度開始されたEdebugの実行をストップするには、他に3つの方法があります。それはbreakpoint、グローバルbreak条件、およびソースbreakpointです。
| 17.2.6.1 Edebug Breakpoints | ストップポイントのbreakpoint。 | |
| 17.2.6.2 Global Break Condition | イベントによるbreak。 | |
| 17.2.6.3 Source Breakpoints | ソースコードに埋め込まれたbreakpoint。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Edebugを使用しているときは、テスト中のプログラム内にbreakpointを指定できます。breakpointとは、実行がストップされる場所のことです。Using Edebugで定義されている任意のストップポイントに、breakpointをセットできます。breakpointをセットおよび解除において影響を受けるストップポイントは、ソースコードバッファー内でポイント位置、またはポイント位置の後の最初のストップポイントです。以下はEdebugのbreakpoint用のコマンドです:
ポイント位置、またはポイント位置の後のストップポイントに、breakpointをセットする(edebug-set-breakpoint)。プレフィクス引数を使用した場合、それは一時的なbreakpointになり、プログラムが最初にそこで停止したとき解除される。
(もしあれば)ポイント位置、またはポイント位置の後のストップポイントにあるbreakpointを解除(unset)する(edebug-unset-breakpoint)。
conditionを評価して非nil値になる場合だけプログラムをストップする、条件付きbreakpointをセットする(edebug-set-conditional-breakpoint)。プレフィクス引数を指定した場合は、一時的なbreakpointになる。
カレント定義内の、次のbreakpointにポイントを移動する(edebug-next-breakpoint)。
Edebug内では、bでbreakpointをセットして、uでそれを解除できます。最初に望ましいストップポイントにポイントを移動してから、そこにbreakpointをセットまたは解除するためにbまたはuをタイプしますbreakpointがない場所でbreakpointを解除しても、影響はありません。
ある定義を再評価、または再インストルメントすると、以前のbreakpointはすべて削除されます。
条件付きbreakpoint(conditional
breakpoint)は、プログラムがそこに達するたびに条件をテストします。条件を評価した結果エラーが発生した場合、エラーは無視され結果はnilになります。条件付きbreakpointをセットするにはxを使用して、ミニバッファーで条件式を指定します。以前にセットされた条件付きbreakpointがあるストップポイントに条件付きbreakpointをセットすると、以前の条件式がミニバッファーに配されるので、それを編集できます。
プレフィクス引数を指定してbreakpointをセットするコマンドを使用することにより、一時的な条件付きbreakpoint、および無条件のbreakpointを作成できます。一時的なbreakpointによりプログラムがストップしたとき、そのbreakpointは自動的に解除されます。
Go-nonstopモードを除き、Edebugは常にbreakpointでストップ、またはpauseします。Go-nonstopモードでは、breakpointは完全に無視されます。
breakpointがどこにあるか探すには、Bコマンドを使用します。このコマンドは同じ関数内から、ポイント以降にある次のbreakpoint(ポイント以降にbreakpointが存在しない場合は最初のbreakpoint)にポイントを移動します。このコマンドは実行を継続せず、単にバッファー内のポイントを移動します。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
グローバルbreak条件(global break
condition)は指定された条件が満たされたとき、それがどこで発生したかによらず、実行をストップします。Edebugは、すべてのストップポイントでグローバルbreak条件を評価します。これが非nil値に評価された場合は、あたかもそのストップポイントにbreakpointがあったかのように、実行をストップまたはpauseします(実行モードによる)。条件の評価でエラーを取得した場合は、実行をストップしません。
条件式はedebug-global-break-conditionに格納されます。EdebugがアクティブなときにソースバッファーからXコマンドを使用するか、Edebugがロードされている間は任意のバッファーから任意のタイミングでC-x
X X(edebug-set-global-break-condition)を使用することにより新たな式を指定できます。
グローバルbreak条件は、コード内のどこでイベントが発生したかを見つけるもっともシンプルな方法ですが、コードの実行は遅くなります。そのため、使用しないときは条件をnilにリセットするべきです。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
定義内のすべてのbreakpointは、それをインストルメントするたびに失われます。breakpointが失われないようにしたい場合は、ソースコード内で単に関数edebugを呼び出すソースbreakpoint(source
breakpoint)を記述できます。もちろん、そのような呼び出しを条件付きすることにもできます。たとえばfac関数内に以下のような行を1行目に挿入して、引数が0になったときストップさせることができます:
(defun fac (n)
(if (= n 0) (edebug))
(if (< 0 n)
(* n (fac (1- n)))
1))
facの定義がインストルメントされて呼び出されたとき、edebug呼び出しはbreakpointとして振る舞います。実行モードに応じて、Edebugはそこでストップまたはpauseします。
edebugが呼び出されたときにインストルメント済みのコードが実行されていなければ、この関数はdebugを呼び出します。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
エラーがシグナルされて、それがcondition-caseでハンドルされていないとき、Emacsは通常エラーメッセージを表示します。Edebugがアクティブでインストルメント済みのコードを実行中は、ハンドルされていないエラーには通常Edebugが対応します。オプションedebug-on-errorおよびedebug-on-quitで、これをカスタマイズできます。Edebug Optionsを参照してください。
Edebugがエラーに対応するときは、エラー発生箇所の前にある最後のストップポイントを表示します。この場所はインストルメントされていない関数の呼び出しで、その関数内で実際にエラーが発生したのかもしれません。バインドされていない変数に関するエラーの場合は、最後の既知のストップポイントは、その不正な変数参照から遠く離れた場所かもしれません。そのような場合は、完全なbacktraceを表示したいと思うでしょう(Miscellaneous Edebug Commandsを参照)。
Edebugがアクティブの間にdebug-on-error、またはdebug-on-quitを変更した場合、それらの変更はEdebugが非アクティブになったとき失われます。さらに、Edebugの再帰編集の間、これらの変数はEdebugの外部でもっていた値にバインドされます。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
これらのEdebugコマンドは、Edebugにエントリーする前のバッファーの外観と、ウィンドウの状態を調べるコマンドです。外部のウィンドウ構成は、ウィンドウのコレクションとその内容であり、これらは実際にEdebugの外部にあります。
外部のウィンドウ構成ビューに切り替える(edebug-view-outside)。Edebugにリターンするには、C-x X
wをタイプする。
一時的に外部のカレントバッファーを表示し、ポイントもその外部の位置になる(edebug-bounce-point)。Edebugにリターンする前に、1秒pauseする。プレフィクス引数nを指定すると、かわりにn秒pauseする。
ソースコードバッファー内のカレントストップポイントにポイントを戻す(edebug-where)。
このコマンドを同じバッファーを表示する異なるウィンドウで使用した場合には、そのウィンドウは将来カレント定義を表示するために代用される。
Edebugが外部のウィンドウ構成を保存、およびリストアするかどうかを切り替える(edebug-toggle-save-windows)。
プレフィクス引数を指定すると、Wは選択されたウィンドウの保存とリストアだけを切り替える。ソースコードバッファーを表示していないウィンドウを指定するには、グローバルキーマップからC-x
X Wを使用しなければならない。
v、または単にpでカレントバッファーにポイントを反跳させれば、たとえ通常は表示されないウィンドウでも、外部のウィンドウ構成を調べることができます。
ポイントを移動した後に、ストップポイントに戻りたいときがあるかもしれません。これは、ソースコードバッファーからwで行うことができます。どのバッファーにいても、C-x X wを使用すれば、ソースコードバッファー内のストップポイントに戻ることができます。
保存をオフにするためにWを使用するたびに、Edebugは外部のウィンドウ構成を忘れます。そのため、たとえ保存をオンに戻しても、(プログラムを実行することにより)次にEdebugをexitしたとき、カレントウィンドウ構成は変更されないまま残ります。しかし、十分な数のウィンドウをオープンしていない場合は、*edebug*と*edebug-trace*の再表示が、あなたが見たいバッファーと競合するかもしれません。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Edebug内では、まるでEdebugが実行されていないかのように、式を評価できます。式の評価とプリントに際して、Edebugが不可視になるよう試みます。。副作用をもつ式の評価は、Edebugが明示的に保存とリストアを行うデータへの変更を除き、期待したとおり機能するでしょう。このプロセスの詳細は、The Outside Contextを参照してください。
Edebugのコンテキスト外で、式expを評価する(edebug-eval-expression)。つまり、Edebugはその式への干渉を最小限にしようと努める。
Edebug自身のコンテキスト内で、式expを評価する(eval-expression)。
Edebugのコンテキスト外で、ポイントの前の式を評価する(edebug-eval-last-sexp)。
Edebugは、cl.el内の構文(lexical-let、macrolet、symbol-macrolet)により作成された、レキシカル(lexical)にバインドされたシンボルへの参照を含む式の評価をサポートします。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
式をインタラクティブに評価するために、*edebug*と呼ばれる評価リストバッファー(evaluation list buffer)を使用できます。Edebugがディスプレイを更新するたびに自動的に評価される、式の評価リスト(evaluation list)もセットアップできます。
評価リストバッファー*edebug*に切り替える(edebug-visit-eval-list)。
*edebug*バッファーでは、以下の特別なコマンドと同様に、Lisp Interactionモード(see Lisp Interaction in The GNU Emacs Manual)のコマンドも使用できます。
ポイントの前の式をコンテキスト外で評価して、その値をバッファーに挿入する(edebug-eval-print-last-sexp)。
Edebugのコンテキスト外で、ポイントの前の式を評価する(edebug-eval-last-sexp)。
バッファー内のコンテンツから、新たに評価リストを構築する(edebug-update-eval-list)。
ポイントのある評価リストグループを削除する(edebug-delete-eval-item)。
ソースコードバッファーに切り替えてカレントストップポイントに戻る(edebug-where)。
評価リストウィンドウ内では、*scratch*にいるときと同様に、C-jやC-x C-eで式を評価できますが、それらはEdebugのコンテキスト外で評価されます。
インタラクティブに入力した式(とその結果)は、実行を継続すると失われます。しかし、実行がストップされるたびに評価されるように、式から構成される評価リストをセットアップできます。
これを行なうには、評価リストバッファー内で1つ以上の評価リストグループ(evaluation list group)を記述します。評価リストグループは、1つ以上のLisp式から構成されます。グループはコメント行で区切られます。
コマンドC-c
C-u(edebug-update-eval-list)は、バッファーをスキャンして各グループの最初の式を使用して、評価リストを再構築します。(これはグループの2つ目の式は以前に計算、表示されている値だという発想からです。)
Edebugにエントリーするたびに、評価リストの各式(および式の後に式のカレント値)をバッファーに挿入して再表示します。これはコメント行も挿入するため、各式はそのグループの一員となります。したがって、バッファーのテキストを変更せずにC-c C-uとタイプした場合、評価リストは実際には変更されません。
評価リストからの評価の間にエラーが発生した場合、それが式の結果であるかのようにエラーメッセージが文字列で表示されます。したがって、カレントで無効な変数を使用する式により、デバッグが中断されることはありません。
以下は、いくつかの式を評価リストウィンドウに追加したとき、どのように見えるかの例です:
(current-buffer) #<buffer *scratch*> ;--------------------------------------------------------------- (selected-window) #<window 16 on *scratch*> ;--------------------------------------------------------------- (point) 196 ;--------------------------------------------------------------- bad-var "Symbol's value as variable is void: bad-var" ;--------------------------------------------------------------- (recursion-depth) 0 ;--------------------------------------------------------------- this-command eval-last-sexp ;---------------------------------------------------------------
グループを削除するには、グループ内にポイントを移動してC-c C-dをタイプするか、単にグループのテキストを削除してC-c C-uで評価リストを更新します。評価リストに新たな式を追加するには、適切な箇所にその式を挿入し、新たなコメント行を挿入してからC-c C-uをタイプします。コメント行にダッシュを挿入する必要はありません — 内容は関係ないのです。
*edebug*を選択した後に、C-c C-wでソースコードバッファーにリターンできます。*edebug*は実行を継続したときkillされ、次回必要なとき再作成されます。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
プログラム内の式が循環リスト構造(circular list structure)を含む値を生成する場合は、Edebugがそれをプリントしようとしたときエラーとなるかもしれません。
循環構造への対処の1つに、print-lengthおよびprint-levelにプリントの切り詰めをセットする方法があります。Edebugは、変数edebug-print-lengthおよびedebug-print-levelの値(非nil値をもつ場合)を、これらの変数にバインドします。Variables Affecting Outputを参照してください。
非nilの場合は、結果をプリントするときEdebugはprint-lengthをこの値にバインドする。デフォルト値は50。
非nilの場合は、結果をプリントするときEdebugはprint-levelをこの値にバインドする。デフォルト値は50。
print-circleを非nil値にバインドして、循環構造や要素を共有する構造を、より参考になる情報をプリントすることもできます。
以下は循環構造を作成するコードの例です:
(setq a '(x y)) (setcar a a)
カスタムプリントはこれを、‘Result: #1=(#1# y)’のようにプリントします。‘#1=’という表記はその後の構造をラベル‘1’とラベル付けし、‘#1#’表記はその前にラベル付けされた構造を参照しています。この表記は、リストやベクターの任意の共有要素に使用されます。
非nilの場合は、結果をプリントするときEdebugはprint-circleをこの値にバインドする。デフォルト値はt。
他にプログラムもカスタムプリントを使用できます。詳細はcust-print.elを参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Edebugは実行トレースを*edebug-trace*という名前のバッファーに格納して記録できます。実行トレースとは関数呼び出しよリターンのログのことで、関数名と引数、および値が確認できます。トレースレコードを有効にするには、edebug-traceを非nil値にセットしてください。
トレースバッファーの作成は、実行モードのトレースの使用(Edebug Execution Modesを参照)と同じではありません。
トレースレコードが有効なときは、関数へのエントリーとexitのたびに、トレースバッファーに行が追加されます。関数エントリーレコードは‘::::{’、および関数名と引数の値により構成されます。関数exitレコードは‘::::}’、および関数名と関数の結果により構成されます。
‘:’の数は、関数エントリーの再帰レベルを表します。トレースバッファーでは、関数呼び出しの開始と終了の検索に‘{’と‘}’を使用できます。
関数edebug-print-trace-beforeおよびedebug-print-trace-afterを再定義することにより、関数エントリーと関数exitのトレースレコードをカスタマイズできます。
このマクロはbodyフォーム実行活動にたいする、追加のトレース情報をリクエストする。引数stringは、トレースバッファーに配す‘{’または‘}’の後のテキストを指定する。すべての引数は評価され、edebug-tracingはbody内の最後のフォームの値をリターンする。
この関数は、トレースバッファーにテキストを挿入する。テキストは、(apply 'format format-string
format-args)により計算される。エントリー間の区切りとして改行も付け加える。
edebug-tracingおよびedebug-traceは、たとえEdebugが非アクティブでも、呼び出されたときは常にトレースバッファーに行を挿入します。トレースバッファーへのテキストの追加により、挿入された最後の行が見えるようにウィンドウもスクロールします。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Edebugは基本的なカバレッジテスト(coverage test)と実行頻度(execution frequency)の表示を提供します。
カバレッジテストは、すべての式の結果と以前の結果を比較することにより機能します。プログラム内のフォームがそれぞれ、カレントEmacsセッション内でカバレッジテストを開始して以降に、2つの異なる値をリターンした場合、それらのフォームは“カバー”されたと判断します。したがって、プログラムにカバレッジテストを行なうには、そのプログラムをさまざまなコンディション下で実行して、プログラムが正しく振る舞うかに注目します。異なるコンディション下で十分にテストして、すべてのフォームが異なる2つの値をリターンしたとき、Edebugはそのことを告げるでしょう。
カバレッジテストにより実行速度が低下するので、edebug-test-coverageが非nilのときだけカバレッジテストが行なわれます。頻度計数(frequency
count)は、たとえ実行モードがGo-nonstopでも、カバレッジテストが有効か無効かに関わらず、すべての式にたいして処理されます。
定義にたいするカバレッジ情報と頻度数の両方を表示するには、C-x X
=(edebug-display-freq-count)を使用する。単に=(edebug-temp-display-freq-count)とすると、他のキーをタイプするまでの間だけ、同様な情報を一時的に表示する。
このコマンドは、カレント定義の各行の頻度数を表示する。
このコマンドは、コードの各行の下にコメント行として頻度数を挿入する。1回のundoコマンドで、すべての挿入をアンドゥできる。頻度数は式の前の‘(’、または式の後の‘)’、または変数の最後の文字の下に表示される。表示をシンプルにするために、同一行にたいして式の以前頻度数と頻度数が同じ場合は表示しない。
ある式にたいする頻度数の後に文字‘=’がある場合、それはその式が評価されるたびに毎回同じ値をリターンしていることを表す。他の言い方をすると、カバレッジテストの目的からは、その式はまだ“カバー”されていないということである。
ある定義にたいして頻度数とカバレッジデータを明確にするには、単にeval-defunで再インストルメントすればよい。
たとえば、ソースのbreakpointで(fac
5)を評価した後、edebug-test-coverageをtにセットすると、breakpointに達したときの頻度データは以下のようになります:
(defun fac (n)
(if (= n 0) (edebug))
;#6 1 = =5
(if (< 0 n)
;#5 =
(* n (fac (1- n)))
;# 5 0
1))
;# 0
コメント行は、facが6回呼び出されたことを表しています。最初のif命令は毎回同じ結果を5回リターンしています。同じ結果という意味では、2つ目のifの条件にも当てはまります。facの再帰呼び出しは、結局リターンしません。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Edebugはデバッグ中のプログラムにたいして透過的であろうと努めますが、完全には達成されません。Edebugは、eや評価リストバッファーで式を評価するときも、一時的に外部のコンテキストをリストアして、透明化を試みます。このセクションではEdebugがリストアするコンテキストと、Edebugがいかにして完全に透過的になるのに失敗するかを正確に説明します。
| 17.2.14.1 Checking Whether to Stop | 何を行うかをEdebugが決定するタイミング。 | |
| 17.2.14.2 Edebug Display Update | Edebugがディスプレイを更新するタイミング。 | |
| 17.2.14.3 Edebug Recursive Edit | Edebugが実行をストップするタイミング。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Edebugにエンターするときは常に特定のデータの保存とリストアを行なう必要があり、それはトレース情報を作成するか、あるいはプログラムを停止するかを決定する前に行なう必要があります。
max-lisp-eval-depthおよびmax-specpdl-sizeは、Edebugがスタック与える影響の低減効果を高める。しかしそれでも、Edebug使用時にスタック空間を使い切ってしまうことはあり得る。
edebug-continue-kbd-macroがnilの場合は、executing-kbd-macroがnilにバインドされる。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
(たとえばtraceモードなどで)Edebugが何かを表示する必要があるときは、Edebugの“外部”からカレントウィンドウ構成(Window Configurationsを参照)を保存します。Edebugをexitするときに、以前のウィンドウ構成がリストアされます。
Emacsは、pause時だけ再表示を行います。通常は実行を継続したときに、そのプログラムはbreakpointまたはステップ実行後にEdebugに再エンターし、その間にpauseや入力の読み取りはありません。そのような場合、Emacsが“外部”の構成を再表示する機会は決してありません。結果として、ユーザーが目にするウィンドウ構成は、前回Edebugが中断なしでアクティブだったときのウィンドウ構成と同じになります。
何かを表示するためにEdebugにエントリーすることにより、(たとえこれらのうちのいくつかは、エラーやquitがシグナルされたときは、故意にリストアしないデータだとしても)以下のデータも保存およびリストアされます。
edebug-save-windowsが非nilの場合は、外部のウィンドウ構成が保存およびリストアされる(Edebug Optionsを参照)。
エラーやquitではウィンドウ構成はリストアされないが、save-excursionがアクティブな場合は、たとえエラーやquitのとき外部の選択されたウィンドウが再選択される。edebug-save-windowsの値がリストの場合は、それにリストされたウィンドウだけが保存およびリストアされる。
しかし、ソースコードバッファーのウィンドウの開始位置と水平スクロールはリストアされないので、表示はEdebug内で整合性が保たれたままとなる。
edebug-save-displayed-buffer-pointsが非nilの場合、表示されているそれぞれのバッファー内のポイント値は、保存およびリストアされる。
overlay-arrow-positionとoverlay-arrow-stringは保存およびリストアされるので、同じバッファー内の他の場所の再帰編集から、安全にEdebugを呼び出せる。
cursor-in-echo-areaはnilにローカルにバインドされるので、カーソルはそのウィンドウ内に現れる。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Edebugにエンターしてユーザーのコマンドが実際に読み取られるとき、Edebugは以下の追加データを保存(そして後でリストア)します:
last-command、this-command、last-command-event、last-input-event、last-event-frame、last-nonmenu-event、track-mouse。Edebug内のコマンドは、Edebug外部のこれらの変数に影響をあたえない。
Edebug内でのコマンド実行は、this-command-keysによりリターンされるキーシーケンスを変更でき、Lispからそのキーシーケンスをリセットする方法はない。
Edebugはunread-command-eventsの値の保存およびリストアができない。この変数が重要な値をもつときにEdebugにエンターすると、デバッグ中のプログラムの実行に干渉する可能性がある。
command-historyに追加される。これが稀に実行に影響を与える。
standard-outputとstandard-inputはrecursive-editによりnilにバインドされるが、Edebugは評価の間それらを一時的にリストアする。
defining-kbd-macroはedebug-continue-kbd-macroにバインドされる。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Edebugが正しくマクロを呼び出す式をインストルメントするには、いくつかの特定な配慮が必要になります。このサブセクションでは、その詳細を説明します。
| 17.2.15.1 Instrumenting Macro Calls | 基本的な問題点。 | |
| 17.2.15.2 Specification List | 式の複雑なパターンを指定する方法。 | |
| 17.2.15.3 Backtracking in Specifications | マッチに失敗したときEdebugが行なうこと。 | |
| 17.2.15.4 Specification Examples | Edebug仕様を理解するために。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
EdebugがLispマクロを呼び出す式をインストルメントするときは、正しくインストルメントを行なうために、そのマクロに関して追加の情報が必要になります。これは、マクロ呼び出しのどの部分式(subexpression)が評価されるフォームなのか推測する方法がないからです。(評価はマクロのbodyで明示的に発生するかもしれないし、展開結果が評価されるとき、または任意のタイミングで行われるかもしれません。)
したがって、Edebugが処理するかもしれないすべてのマクロにたいして、そのマクロの呼び出しフォーマットを説明するための、Edebug仕様(Edebug
specification)を定義しなければなりません。これを行なうには、マクロ定義にdebug宣言を追加します。以下はマクロ例for(Evaluating Macro Arguments Repeatedlyを参照)にたいする簡単な仕様の例です。
(defmacro for (var from init to final do &rest body) "Execute a simple \"for\" loop. For example, (for i from 1 to 10 do (print i))." (declare (debug (symbolp "from" form "to" form "do" &rest form))) ...)
このEdebug仕様は、マクロ呼び出しのどの部分が評価されるフォームなのかを示しています。単純なマクロにたいするEdebug仕様は、そのマクロ定義の正式な引数リストに非常に類似している場合がありますが、Edebug仕様はマクロ引数に比べより汎的です。declareフォームの詳細は、Defining Macrosを参照してください。
コードをインストルメントするときEdebugに仕様が確実に解るよう注意してください。マクロ定義を含む他のファイルを要求するためにeval-when-compileを使用するファイルから関数をインストルメントする場合は、そのファイルを明示的にロードする必要があるかもしれません。
def-edebug-specによりマクロ定義から個々のマクロにたいしてEdebug仕様を定義することもできます。Lispで記述されたマクロ定義にたいしてはdebug宣言を追加するほうが好ましく、その方が便利でもありますが、def-edebug-specではCで実装されたスペシャルフォームにたいしてEdebug仕様を定義することが可能になります。
マクロmacro呼び出しのどの式が評価される式かを指定する。specificationはEdebug仕様である。どちらの引数も評価されない。
引数macroは単なるマクロ名ではない、任意の実シンボルを指定できる。
以下はspecificationに指定できるシンボルと、引数を処理する方法のテーブルです。
tすべての引数は評価のためにインストルメントされる。
0引数はインストルメントされない。
そのシンボルは、かわりに使用されるEdebug仕様をもたなければならない。このインダイレクションは、他の種類の仕様が見つかるまで繰り返される。これにより、他のマクロの仕様を継承できる。
リストの要素はフォーム呼び出しの引数の型を記述する。仕様リストに指定できる要素については、以降のセクションを参照。
マクロがEdebug仕様をもたない場合は、debug宣言およびdef-edebug-spec呼び出しのどちらを通じても、変数edebug-eval-macro-argsが効果を発揮する。
これは、Edebugが明示的なEdebug仕様をもたないマクロ引数を扱う方法を制御する。nil(デフォルト)の場合、引数は評価のためにインストルメントされない。それ以外は、すべての引数がインストルメントされる。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
あるマクロ呼び出しにおいて、いくつかの引数は評価されるが、それ以外の引数は評価されないような場合には、Edebug仕様のために仕様リスト(specification
list)が要求されます。仕様リスト内のいくつかの要素は1つ以上の引数にマッチしまづが、それ以外の要素は以降に続くすべての引数の処理を変更します。後者は仕様キーワード(specification
keywords)と呼ばれ、(&optionalのように)‘&’で始まるシンボルです。
仕様リストは、それ自身がリストであるような引数にマッチする部分リスト(sublist)、またはグループ化に使用されるベクターを含むかもしれません。したがって部分式とグループは、仕様リストをレベル階層に細分化します。仕様キーワードは、部分式やグループを含むものの残りに適用されます。
仕様リストに選択肢や繰り返しが含まれる場合は、実際のマクロの呼び出しにたいしてマッチさせるためにバックトラックが要求されるかもしれません。詳細は、Backtracking in Specificationsを参照してください。
Edebug仕様は、バランスのとれたカッコで括られた部分式へのマッチ、フォームの再帰処理、インダイレクト仕様を通じた再帰などの、正規表現によるマッチングと、コンテキストに依存しない文法構成を提供します。
以下は仕様リストに使用できる要素と、その意味についてのテーブルです(使用例はSpecification Examplesを参照):
sexp評価れない単一のLispオブジェクト。インストルメントされない。
form評価される単一のLispオブジェクト。インストルメントされる。
place汎変数(generalized variable)。Generalized Variablesを参照。
body&rest formの省略形。以下の&restを参照。
function-form関数フォーム。クォートされた関数シンボル、クォートされたラムダ式、または(関数シンボルかラムダ式に評価される)フォームのうちのどれか。これはラムダ式のbodyをいずれかの方法でインストルメントするため、functionよりもquoteでクォートされたラムダ式の引数にたいし有用。
lambda-exprクォートされないラムダ式。
&optional仕様リスト内の後続の要素はオプション。マッチしない要素が出現すると、Edebugはこのレベルのマッチングを停止する。
後続が非オプションの要素であるような数個の要素をオプションにするだけなら、[&optional
specs…]を使用する。複数の要素すべてのマッチ、または非マッチを指定するには、&optional
[specs…]を使用する。defunの例を参照。
&rest仕様リスト内の後続のすべての要素は、0回以上繰り返される。しかし、最後の繰り返しでは、仕様リスト内のすべての要素にたいするマッチングの前に式が終了しても問題はない。
数個の要素を繰り返すには、[&rest
specs…]を使用する。各繰り返しにおいいてすべてマッチしなければならない複数要素を指定するには、&rest
[specs…]を使用する。
&or仕様リスト内の後続の各要素は選択肢。選択肢の1つがマッチしなければならず、マッチしない場合&or仕様は失敗する。
&orに続く各リスト要素は、単一の選択肢。複数のリスト要素を単一の選択肢にグループ化するには、それらを[…]で括る。
¬後続の各要素は、&orが使用されたときのように選択肢にマッチするが、要素がマッチした場合に失敗する。どれもマッチする要素がない場合は何もマッチされないが、¬仕様は成功する。
&defineフォーム定義にたいする仕様であることを示す。フォーム定義自体はインストルメントされない(つまりEdebugはフォーム定義の前後でストップしない)が、フォーム内部は通常はインストルメントされるであろう。&defineキーワードはリスト仕様の最初の要素であること。
nilカレント引数レベルでマッチさせる引数が存在しない場合は成功し、それ以外は失敗する。部分リスト仕様とバッククォートの例を参照。
gate引数はマッチされないがgateを通じたバックトラックは、このレベルの使用の残りをマッチングする間は無効にされる。これは主に、特定の構文エラーメッセージを一般的にするために使用される。詳細はBacktracking in Specifications、およびletの例も参照。
other-symbol仕様リスト内のその他の要素は、述語(predicate)かインダイレクト仕様(indirect specification)である。
シンボルがEdebug仕様をもつ場合、インダイレクト仕様(indirect
specification)はシンボル位置に使用されるリスト仕様か、引数を処理するための関数のどちらかである。この仕様はマクロにたいするdef-edebug-specのように定義される。defunの例を参照。
それ以外の場合、シンボルは述語(predicate)である。述語は引数とともに呼び出され、述語がnilをリターンした場合、その仕様は失敗して引数はインストルメントされない。
適切な述語としてはsymbolp、integerp、stringp、vectorp、atomが含まれる。
[elements…]要素のベクターは、要素を単一のグループ仕様(group specification)にグループ化する。このグループ仕様は、ベクター自体に何も行わない。
"string"引数はstringという名前のシンボルである。この仕様は、symbolの名前がstringであるクォートされたシンボル'symbolと等価だが、文字列形式のほうが好ましい。
(vector elements…)引数は、要素が仕様内のelementsにマッチするベクターである。バッククォートの例を参照。
(elements…)他のリストは部分リスト仕様(sublist specification)であり、引数は要素が仕様のelementsにマッチするリストでなければならない。
部分リスト仕様はドットリスト(dotted
list)かもしれず、その場合対応するリスト引数はドットリストである。かわりに、ドットリスト仕様の最後のCDRが、(グループ化やインダイレクト仕様による)他の部分リスト仕様かもしれない(たとえば要素が非ドットリストにマッチする(spec
. [(more
specs…)])))。これはバッククォートの例のような再帰仕様に有用。このような再帰を終了させるには、上述のnil仕様も参照。
(specs . nil)のように記述された部分リスト仕様は(specs)、(specs .
(sublist-elements…))は(specs
sublist-elements…)と等価であることに注意。
以下は&defineの後だけに出現する追加仕様のリストです。defunの例を参照してください。
name引数(シンボル)は定義フォームの名前。
定義フォームは名前フィールドをもつ必要はなく、複数の名前フィールドをもつかもしれない。
:nameこの構成は引数に実際のマッチは行わない。:nameの後の要素はシンボルであり、その定義の追加の名前要素として使用される。定義名に一意で静的な要素を加えるために、これを使用できる。複数回使用されるかもしれない。
arg引数(シンボル)は定義フォームの引数の名前である。しかし、lambda-listキーワード(‘&’で始まるシンボル)は許されない。
lambda-listこれはラムダリスト(ラムダ式の引数リスト)にマッチする。
def-body引数は定義内のコードのbodyである。これは上述のbodyと似ているが、定義のbodyはその定義に関連する情報を照会する別のEdebug呼び出しでインストルメントされていなければならない。定義内のより高位レベルのフォームリストには、def-bodyを使用する。
def-form引数は、定義内のもっとも高位レベルの単一フォームである。これはdef-bodyと似ているが、フォームリストではなく単一フォームのマッチに使用される。特別なケースとして、def-formはフォームが実行されるときトレース情報を出力しないことも意味する。interactiveの例を参照。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
あるポイント位置で仕様がマッチに失敗しても、構文エラーがシグナルされるとは限りません。そのかわりバックトラック(backtracking)が開始されます。バックトラックは、すべての選択肢をマッチングするまで行なわれます。最終的に引数リストのすべての要素は仕様内の要素のいずれかとマッチしなければならず、仕様内の必須要素は引数のいずれかとマッチしなければなりません。
構文エラーが検出されてもその時点では報告されず、より高位レベルの選択肢のマッチングが終わった後、実際のエラー箇所から離れたポイント位置でエラーが報告されるかもしれません。しかしエラー発生時にバックトラックが無効なら、エラーは即座に報告されるでしょう。ある状況においては、バックトラックも自動的に再有効化されることに注意してください。&optional、&rest、&orにより新たな選択肢が設定されたとき、または部分リスト、グループ、インダイレクト仕様が開始されたときは、バックトラックが自動的に有効になります。バックトラックを有効、または無効にした場合の影響は、現在処理中のレベルの残り要素と、低位レベルに限定されます。
何らかのフォーム仕様(すなわちform、body、def-form、def-body)をマッチングする間、バックトラックは無効になっています。これらの仕様は任意のフォームにマッチするので、何らかのエラーが発生するとしたらそれは高位レベルではなく、そのフォーム自体の内部でなければなりません。
バックトラックはクォートされたシンボルや文字列仕様とのマッチに成功した後にも無効になります。なぜなら通常これは構成が認識されたことを示すからです。しかし、同じシンボルで始まる一連の選択肢構成がある場合は、たとえば["foo"
&or [first case] [second case]
...]のように、通常は選択肢の外部にそのシンボルをファクタリングすることにより、この制約に対処できます。
ほとんどのニーズは、バックトラックを自動的に無効にする、これら2つの方法で満足させることができますが、gate仕様を使用して明示的にバックトラックを無効にするほうが便利なときもあります。これは、高位に適用可能な選択肢が存在しないことが分かっている場合に有用です。let仕様の例を参照してください。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下で提供する例から学ぶことにより、Edebug仕様の理解が容易になるかもしれません。
スペシャルフォームletは、バインディングとbodyのシーケンスをもちます。各バインディングはそシンボル、またはシンボルとオプションの部分リストです。以下の仕様では、部分リストを見つけたらバックトラックを抑止するために、部分リスト内のgateがあることに注目してください。
(def-edebug-spec let
((&rest
&or symbolp (gate symbolp &optional form))
body))
Edebugはdefunおよび関連する引数リスト、interactive仕様にたいして以下の仕様を使用します。式の引数はその関数bodyの外部で実際に評価されるので、interactiveフォームは特別に処理する必要があります。(defmacroにたいする仕様はdefunにたいする仕様と非常に似ていますが、declare命令文が許されます。)
(def-edebug-spec defun
(&define name lambda-list
[&optional stringp] ; ドキュメント文字列が与えられた場合はマッチする。
[&optional ("interactive" interactive)]
def-body))
(def-edebug-spec lambda-list
(([&rest arg]
[&optional ["&optional" arg &rest arg]]
&optional ["&rest" arg]
)))
(def-edebug-spec interactive
(&optional &or stringp def-form)) ; Notice: def-form
以下のバッククォートにたいする仕様は、ドットリストにマッチさせる方法と、nilを使用して再帰を終了させる方法を説明するための例です。また、ベクターのコンポーネントをマッチさせる方法も示しています。(Edebugにより定義される実際の仕様は少し異なり、ドットリストについては失敗するかもしれない非常に深い再帰を引き起こすためサポートしていません。)
(def-edebug-spec \` (backquote-form)) ; Alias just for clarity.
(def-edebug-spec backquote-form
(&or ([&or "," ",@"] &or ("quote" backquote-form) form)
(backquote-form . [&or nil backquote-form])
(vector &rest backquote-form)
sexp))
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下のオプションは、Edebugの動作に影響を与えます:
Edebugが使用される前に呼び出される関数。この関数は毎回新たな値をセットする。Edebugこれらの関数を一度呼び出したら、その後edebug-setup-hooknilにリセットする。使用するパッケージに関係するEdebug仕様をロードするために使用dきるが、それはEdebugを使用するときだけである。Instrumenting for Edebugを参照。
これが非nilの場合はdefunやdefmacroのような定義フォームの普通に評価すると、Edebug用にインストルメントされる。これはeval-defun、eval-region、eval-buffer、and
eval-current-bufferに適用される。
このオプションの切り替えには、コマンドM-x edebug-all-defsを使用する。Instrumenting for Edebugを参照。
これが非nilの場合eval-defun、eval-region、eval-buffer、eval-current-bufferは、たとえフォームが何も定義していなくても、すべてのフォームをインストルメントする。これはロードとミニバッファー内の評価には適用されない。
このオプションの切り替えには、コマンドM-x edebug-all-formsを使用する。Instrumenting for Edebugを参照。
これが非nilの場合、Edebugはウィンドウ構成の保存とリストアを行なう。これにはある程度時間がかかるので、ウィンドウ構成に何が起こってもプログラムに関係しない場合は、この変数をnilにセットしたほうがよい。
値がリストの場合は、リストされたウィンドウだけが保存およびリストアされる。
Edebug内では、この変数をインタラクティブに変更するためにWコマンドを使用できる。Edebug Display Updateを参照。
これが非nilの場合、Edebugは表示されているすべてのバッファー内のポイントを保存およびリストアする。
選択されていないウィンドウ内に表示されているバッファーのポイントを変更するコードをデバッグしている場合は、他のバッファーのポイントを保存およびリストアする必要がある。その後にEdebugまたはユーザーがそのウィンドウを選択した場合は、そのバッファー内のポイントは、そのウィンドウのポイント値に移動される。
すべてのバッファー内のポイントの保存とリストアは、それぞれのウィンドウを2回選択する必要があり高価な処理のため、必要なときだけ有効にする。Edebug Display Updateを参照。
この変数が非nilの場合、Edebugが最初にアクティブになったときの、Edebugの最初の実行モードを指定する。指定できる値はstep、next、go、Go-nonstop、trace、Trace-fast、continue、Continue-fast。
デフォルト値はstep。Edebug Execution Modesを参照。
これが非nilの場合が、各関数のエントリーとexitをトレースする。トレース出力は、関数のエントリーとexitを行ごとに、再帰レベルにしたがって*edebug-trace*という名前のバッファーに表示される。
Trace Bufferのedebug-tracingも参照のこと。
非nilの場合、Edebugはデバッグされるすべての式のカバレッジをテストする。Coverage Testingを参照。
非nilの場合は、Edebug外で実行されている任意のキーボードマクロの定義または実行を継続する。これはデバッグされないので、慎重に使用すること。Edebug Execution Modesを参照。
非nilの場合、Edebugは式の結果を表示するときに、その式自体のインストルメント結果の削除を試みる。マクロをデバッグするときは、式の結果自体がインストルメントされた式になるということに関連する。実際的な例ではないが、サンプル例の関数facがインストルメントされたとき、そのフォームのマクロを考えてみるとよい。
(defmacro test () "Edebug example."
(if (symbol-function 'fac)
…))
testマクロをインストルメントしてステップ実行すると、デフォルトではsymbol-function呼び出しは多数のedebug-afterフォームとedebug-beforeフォームをもつことになり、それにより“実際の”結果の確認が難しくなり得る。edebug-unwrap-resultsが非nilの場合、Edebugは結果からこれらのフォームの削除を試みる。
debug-on-errorの以前がnilの場合、Edebugはdebug-on-errorをこの値にバインドする。Trapping Errorsを参照。
debug-on-quitの以前の値がnilの場合、Edebugはdebug-on-quitにこの値をバインドする。Trapping Errorsを参照。
Edebugがアクティブな間にedebug-on-errorまたはedebug-on-quitの値を変更した場合は、次回に新たなコマンドを通じてEdebugが呼び出されるまで、これらの値は使用されない。
非nilの場合、値はすべてのステップポイントでテストされる式である。式の結果がnilの場合は、breakする。エラーは無視される。Global Break Conditionを参照。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lispリーダーは無効な構文(invalid syntax)について報告はしますが、実際の問題箇所は報告しません。たとえば、ある式を評価中のエラー“End of file during parsing(パース中にファイル終端に達した)”は、開カッコまたは開角カッコ(open parenthese or open square bracket)が多いことを示しています。Lispリーダーはこの不一致をファイル終端で検出しましたが、本来閉カッコがあるべき箇所を解決することはできません。同様に、“Invalid read syntax: ")"(無効なread構文:)")"”は開カッコの欠落を示していますが、欠落しているカッコが属すべき場所は告げません。ならば、どうやって変更すべき箇所を探せばよいのでしょうか?
問題が単なるカッコの不一致でない場合の便利なテクニックは、各defunの先頭でC-M-eとタイプして、そのdefunの最後と思われる箇所に移動するか確認する方法です。もし移動しなければ、問題はそのdefunの内部にあります。
マッチしないカッコがLispにおいてもっとも一般的な構文エラーなので、これらのケースにたいしてさらにアドバイスすることができます。(Show Parenモードを有効にしてコードにポイントを移動するだけで、カッコの不一致を探しやすくなるでしょう。)
| 17.3.1 Excess Open Parentheses | 誤った開カッコと閉カッコを探す方法。 | |
| 17.3.2 Excess Close Parentheses | 誤った閉カッコと開カッコを探す方法。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
カッコがマッチしないdefunを探すのが、最初のステップです。過剰な開カッコが存在する場合は、ファイルの終端に移動してC-u C-M-uとタイプします。これにより、カッコがマッチしない最初のdefunの先頭に移動するでしょう。
何が間違っているのか正確に判断するのが次のステップです。これを確実に行なうには、そのプログラムを詳しく調べる以外に方法はありませんが、カッコがあるべき箇所を探すのに、既存のインデントが手掛かりになることが多々あります。C-M-qで再インデントして何が移動されるか確認するのが、この手掛かりを使用するもっとも簡単な方法です。しかし、行うのはちょっと待ってください! まず続きを読んでからにしましょう。
これを行なう前に、defunに十分な閉カッコがあるか確認します。十分な閉カッコがない場合、C-M-qがエラーとなるか、そのdefunからファイル終端までの残りすべてが再インデントされます。その場合はdefunの最後に移動して、そこに閉カッコを挿入します。そのdefunのカッコの釣り合いがとれるまでは、defunの最後に移動するのにC-M-eは使用できません(失敗するでしょう)。
これでdefunの先頭に移動してC-M-qとタイプすることができます。通常は、一定のポイントからその関数の最後までのすべての行が、右へとシフトされるでしょう。これはおそらくそのポイント付近で閉カッコが欠落しているか、不要な開カッコがあります。(しかし、これを真実と仮定せず、コードを詳しく調べてください。) 不一致箇所が見つけたら、元のインデントはおそらく意図されたカッコに適しているはずなので、C-_でC-M-qをアンドゥしてください。
問題をfixできたと思った後に、再度C-M-qを使用します。実際に元のインデントが意図したカッコのネストに適合していて、足りないカッコを追加していたら、C-M-qは何も変更しないはずです。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
過剰な閉カッコへの対処は、まずファイルの先頭に移動してから、カッコのマッチしないdefunを探すためにC-u -1 C-M-uをタイプします。
それから、そのdefunの先頭でC-M-fをタイプして、実際にマッチする閉カッコを探します。これにより、そのdefunの終端より幾分手前の箇所に移動するでしょう。その付近に間違った閉カッコが見つかるでしょう。
そのポイントに問題が見つからない場合には、そのdefunの先頭でC-M-qをタイプするのが次のステップです。ある行範囲はおそらく左へシフトするでしょう。その場合、欠落している開カッコまたは間違った閉カッコは、おそらくそれらの行の1行目の近くにあるでしょう。 (しかし、これを真実と仮定せず、コードを詳しく調べてください。)不一致箇所が見つけたら、元のインデントはおそらく意図されたカッコに適しているはずなので、C-_でC-M-qをアンドゥしてください。
問題をfixできたと思った後に、再度C-M-qを使用します。実際に元のインデントが意図したカッコのネストに適合していて、足りないカッコを追加していたら、C-M-qは何も変更しないはずです。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
testcoverライブラリーをロードして、コマンドM-x testcover-start RET
file
RETでコードをインストルメントすることにより、Lispコードのファイルにたいしてカバレッジテストを行なうことができます。コードを1回以上呼び出すことにより、テストが行なわれます。コマンドM-x
testcover-mark-allを使用すれば、カバレッジが不十分な箇所が色付きでハイライト表示されます。コマンドM-x
testcover-next-markは、次のハイライトされた箇所へポイントを前方に移動します。
通常、赤くハイライトされた箇所はそのフォームが完全に評価されたことが一度もないことを示し、茶色でハイライトされた箇所は常に同じ値に評価された(その結果にたいして少ししかテストされていない)ことを意味します。しかし、errorのように完全に評価するのが不可能なフォームにたいしては、赤いハイライトはスキップされます。(setq
x 14)のように、常に同じ値に評価されることが期待されるフォームにたいしては、茶色のハイライトスキップされます。
難しいケースでは、テストカバレッジツールにアドバイスを与えるために、コードにdo-nothingマクロを追加することができます。
formを評価してその値をリターンするが、テストカバレッジにたいしてformが常に同じ値だという情報を与える。
formを評価し、formが決してリターンしないという情報をカバレッジテストに与える。もしリターンした場合は、run-timeエラーとなる。
Edebugにもカバレッジテスト機能があります(Coverage Testingを参照)。これらの機能は部分的に重複しており、組み合わせることで明確になるでしょう。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
プログラムは正常に機能しているものの、より高速にまたは効率的に実行させたい場合にまず行うべきは、そのプログラムがリソースをどのように使用するか知るために、コードをプロファイル(profile)することです。ある特定の関数の実行が、実行時間のうち無視できない割り合いを占めるようなら、その部分を最適化する方法を探すことを開始できます。
Emacsには、このためのビルトインサポートがあります。プロファイリングを開始するには、M-x profiler-startをタイプします。プロファイルはプロセッサー使用(processor usage)、メモリー使用(memory usage)、またはその両方を選択できます。何らかの処理を行った後にM-x profiler-reportとタイプすると、プロファイルに選択した各リソースがsummaryバッファーに表示されます。reportバッファーの名前には、そのレポートが生成された時刻が含まれるので、前の結果を消去せずに後で他のレポートを生成できます。プロファイリングが終了したら、M-x profiler-stopとタイプしてください(プロファイリングに関連したオーバーヘッドが少しあるからです)。
profiler reportバッファーでは、各行に呼び出された関数と、その後にプロファイリングが開始されてから使用したリソース(プロセッサーまたはメモリー)の絶対時間とパーセンテージ時間が表示されます。左側にシンボル‘+’のある行ではRETをタイプして行を展開して、高位レベルの関数に呼び出された関数を確認できます。もう一度RETをタイプすると、元の状態へと行が折り畳まれます。
jまたはmouse-2を押下すると、関数の定義にジャンプします。dを押下すると、関数のドキュメントを閲覧できます。C-x C-wを使用して、プロファイルをファイルに保存できます。=を使用すれば、2つのプロファイルを比較することができます。
elpライブラリーは、別のアプローチを提案します。使い方はelp.elを参照してください。
benchmarkライブラリーを使用して、Emacs
Lispフォームのスピードwpy個別にチェックできます。benchmark.el内の関数benchmark-run、およびbenchmark-run-compiledを参照してください。
configureのオプションに--enable-profilingを使用してビルドすることにより、EmacsをCコードのレベルでプロファイルすることができます。こうしてビルドされたEmacsは、Emacsをexitするときにgprofユーティリティを使用して検証できるファイルgmon.outを生成します。この機能は主にEmacsのデバッグに有用です。このEmacsは、実行状態から上述のM-x
profiler-…コマンドによりLispレベルで実際にストップします。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
プリント(print)および読み取り(read)は、Lispオブジェクトからテキスト形式への変換、またはその逆の変換を行なう操作です。これらはLisp Data Typesで説明したプリント表現(printed representation)と入力構文(read syntax)を使用します。
このチャプターでは、読み取りおよびプリントのためのLisp関数について説明します。このチャプターではさらにストリーム(stream)についても説明します。ストリームとは、(読み取りにおいては)テキストがどこから取得されるか、(プリントにおいては)テキストをどこに出力するかを指定します。
| 18.1 Introduction to Reading and Printing | ストリーム、読み取り、プリントの概観。 | |
| 18.2 Input Streams | 入力ストリームとして使用できる、さまざまなデータ型。 | |
| 18.3 Input Functions | テキストからLispオブジェクトを読み取る関数。 | |
| 18.4 Output Streams | 出力ストリームとして使用できる、さまざまなデータ型。 | |
| 18.5 Output Functions | テキストとしてLispオブジェクトをプリントする関数。 | |
| 18.6 Variables Affecting Output | プリント関数が何を行うか制御する変数。 |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lispオブジェクトの読み取りとは、テキスト形式のLisp式をパース(parse:
構文解析)して、対応するLispオブジェクトを生成することを意味します。これは、LLispプログラムがLispコードファイルからLispに取得される方法でもあります。わたしたちは、そのテキストをそのオブジェクトの入力構文(read
syntax)と呼んでいます。たとえばテキスト‘(a .
5)’は、CARがaでCDRが数字の5であるようなコンスセルにたいする入力構文です。
Lispオブジェクトのプリントとは、あるオブジェクトをそのオブジェクトのプリント表現(printed representation) (Printed Representation and Read Syntaxを参照)に変換することにより、そのオブジェクトを表すテキストを生成することを意味します。上述のコンスセルをプリントすると、テキスト‘(a . 5)’が生成されます。
読み取りとプリントは、概ね逆の処理といえます。あるテキスト断片を読み取った結果生成されたオブジェクトをプリントすると、多くの場合は同じテキストが生成され、あるオブジェクトをプリントした結果のテキストを読み取ると、通常は同じようなオブジェクトが生成されます。たとえばシンボルfooをプリントするとテキスト‘foo’が生成され、そのテキストを読み取るとシンボルfooがリターンされます。要素がaとbのリストをプリントするとテキスト‘(a
b)’が生成され、そのテキストを読み取ると、(同じリストではないが)要素がaとbのリストが生成されます。
しかし、これら2つの処理は互いにまったく逆の処理というわけではありません。3つの例外があります:
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
テキストを読み取るLisp関数の大部分は、引数として入力ストリーム(input stream)をとります。入力ストリームは、読み取られるテキストの文字をどこから、どのように取得するかを指定します。以下は可能な入力ストリーム型です:
入力文字はbufferのポイントの後の文字から直接読み取られる。文字の読み取りとともに、ポイントが進む。
入力文字はmarkerのあるバッファーの、マーカーの後の文字から直接読み取られる。文字の読み取りとともに、マーカーが進む。ストリームがマーカーのときは、バッファー内のポイント値に影響はない。
入力文字はstringの最初の文字から必要な文字数分が取得される。
入力文字はfunctionから生成され、その関数は2種類の呼び出しをサポートしなければならない:
ttは、その入力がミニバッファーから読み取られるストリームであることを意味する。実際にはミニバッファーが1回呼び出されて、ユーザーから与えられたテキストが、その後に入力ストリームとして使用される文字列となる。Emacsがbatchモードで実行されている場合は、ミニバッファーのかわりに標準入力が使用される。たとえば、
(message "%s" (read t))
このような場合は標準入力からLisp式が読み取られて、結果は標準出力にプリントされるだろう。
nil入力ストリームとしてnilが与えられた場合は、かわりにstandard-inputの値が使用されることを意味する。この値はデフォルトの入力ストリーム(default
input stream)であり、非nilの入力ストリームでなければならない。
入力ストリームとしてのシンボルは、(もしあれば)そのシンボルの関数定義と等価である。
以下の例では、バッファーストリームから読み込み、読み取りの前後におけるポイント位置を示しています:
---------- Buffer: foo ---------- This∗ is the contents of foo. ---------- Buffer: foo ----------
(read (get-buffer "foo"))
⇒ is
(read (get-buffer "foo"))
⇒ the
---------- Buffer: foo ---------- This is the∗ contents of foo. ---------- Buffer: foo ----------
最初の読み取りではスペースがスキップされていることに注意してください。読み取りにおいては、意味のあるテキストに先行する、任意のサイズの空白文字がスキップされます。
以下は、マーカーストリームからの読み取りの例で、最初は表示されているバッファーの先頭にマーカーが配します。読み取られた値はシンボルThisです。
---------- Buffer: foo ---------- This is the contents of foo. ---------- Buffer: foo ----------
(setq m (set-marker (make-marker) 1 (get-buffer "foo")))
⇒ #<marker at 1 in foo>
(read m)
⇒ This
m
⇒ #<marker at 5 in foo> ;; 最初のスペースの前。
以下では、文字列のコンテンツから読み取っています:
(read "(When in) the course")
⇒ (When in)
以下はミニバッファーから読み取る例です。プロンプトは、‘Lisp expression: ’です。(このプロンプトはストリームtから読み取る際は常に使用されます。) ユーザーの入力はプロンプトの後に表示されます。
(read t)
⇒ 23
---------- Buffer: Minibuffer ----------
Lisp expression: 23 RET
---------- Buffer: Minibuffer ----------
最後は、useless-streamという名前の関数ストリームから読み取る例です。ストリームを使用する前に、変数useless-listを文字のリストに初期化しています。その後は、リスト内の次の文字を取得するため、または文字をリストの先頭に追加することにより読み戻すために、関数useless-streamを呼び出します。
(setq useless-list (append "XY()" nil))
⇒ (88 89 40 41)
(defun useless-stream (&optional unread)
(if unread
(setq useless-list (cons unread useless-list))
(prog1 (car useless-list)
(setq useless-list (cdr useless-list)))))
⇒ useless-stream
このストリームを使って、以下のように読み取ります:
(read 'useless-stream)
⇒ XY
useless-list
⇒ (40 41)
開カッコと閉カッコがリスト内に残ることに注意してください。Lispリーダーは開カッコに出会うと、それを入力の終わりと判断して、読み戻します。次にこのポイント位置からこのストリームを読み取ると、‘()’が読み取られてnilがリターンされます。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、読み取りに関係のあるLisp関数と変数について説明します。
以下の関数で、streamは入力ストリーム(前のセクションを参照)を意味します。streamがnil、または省略された場合のデフォルト値はstandard-inputです。
読み取りにおいて終端されていないリスト、ベクター、文字列に遭遇した場合は、end-of-fileがシグナルされます。
この関数はstreamからテキスト表現されたLisp式を1つ読み取り、Lispオブジェクトとしてリターンする。これは基本的なLisp入力関数である。
この関数はstring内のテキストから、最初のテキスト表現されたLisp式を読み取る。リターン値はCARがその式で、CDRが次に読み取られるその文字列内の残りの文字(読み取られていない最初の文字)の位置を与える整数であるようなコンスセルである。
startが与えられた場合は、文字列内のインデックスstart(最初の文字はインデックス0)から読み取りが開始される。endを指定した場合は、残りの文字列が存在しないかのごとく、そのインデックスの直前で読み取りがストップされる。
たとえば:
(read-from-string "(setq x 55) (setq y 5)")
⇒ ((setq x 55) . 11)
(read-from-string "\"A short string\"")
⇒ ("A short string" . 16)
;; Read starting at the first character.
(read-from-string "(list 112)" 0)
⇒ ((list 112) . 10)
;; Read starting at the second character.
(read-from-string "(list 112)" 1)
⇒ (list . 5)
;; Read starting at the seventh character, ;; and stopping at the ninth. (read-from-string "(list 112)" 6 8) ⇒ (11 . 8)
この変数はデフォルト入力ストリーム(引数streamがnilのときreadが使用するストリーム)を保持する。デフォルトはtで、これはミニバッファーを使用することを意味する。
非nilの場合、この変数は循環構造(circular structure)および共有構造(shared
structures)の読み取りを有効にする。Read Syntax for Circular Objectsを参照。デフォルト値はt。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
出力ストリームは、プリントにより生成された文字に何を行うかを指定します。ほとんどのプリント関数は、オプション引数として出力ストリームを受け入れます。以下は利用できる出力ストリーム型です:
出力文字は、bufferのポイント位置に挿入される。文字が挿入された分、ポイントが進む。
出力文字は、markerのあるバッファーのマーカー位置に挿入される。文字が挿入された分、マーカー位置が進む。ストリームがマーカーのときは、そのバッファー内のポイント位置にプリントは影響せず、この種のプリントでポイントは移動しない(マーカー位置がポイント位置、またはポイント位置より前の場合は除外される。通常はテキストの周囲にポイントが進む)。
出力文字は、文字を格納する役目をもつfunctionに渡される。この関数は1つの文字を引数に、出力される文字の回数呼び出され、その文字を格納したい場所に格納する役目をもつ。
t出力文字はエコーエリアに表示される。
nil出力ストリームにnilが指定された場合は、かわりにstandard-outputの値が使用されることを意味する。この値はデフォルトの出力ストリーム(default
output stream)であり、非nilでなければならない。
出力ストリームとしてのシンボルは、(もしあれば)そのシンボルの関数定義と等価である。
有効な出力ストリームの多くは、入力ストリームとしても有効です。したがって入力ストリームと出力ストリームの違いは、Lispオブジェクトの型ではなく、どのようにLispオブジェクトを使うかという点です。
以下はバッファーを出力ストリームとして使用する例です。ポイントは最初は‘the’の中の‘h’の直前にあります。そして最後も、同じ‘h’の直前に配されます。
---------- Buffer: foo ---------- This is t∗he contents of foo. ---------- Buffer: foo ----------
(print "This is the output" (get-buffer "foo"))
⇒ "This is the output"
---------- Buffer: foo ---------- This is t "This is the output" ∗he contents of foo. ---------- Buffer: foo ----------
次はマーカーを出力ストリームとして使用する例です。マーカーは最初、バッファーfoo内の単語‘the’の中の‘t’と‘h’の間にあります。最後には、挿入されたテキストによりマーカーが進み、同じ‘h’の前に留まります。通常の方法で見られるようなポイント位置への影響がないことに注意してください。
---------- Buffer: foo ---------- This is the ∗output ---------- Buffer: foo ----------
(setq m (copy-marker 10))
⇒ #<marker at 10 in foo>
(print "More output for foo." m)
⇒ "More output for foo."
---------- Buffer: foo ---------- This is t "More output for foo." he ∗output ---------- Buffer: foo ----------
m
⇒ #<marker at 34 in foo>
以下はエコーエリアに出力を表示する例です:
(print "Echo Area output" t)
⇒ "Echo Area output"
---------- Echo Area ----------
"Echo Area output"
---------- Echo Area ----------
最後は関数を出力ストリームとして使用する例です。関数eat-outputは与えられたそれぞれの文字をlast-outputの先頭にconsします(Building Cons Cells and Listsを参照)。最後には、リストには出力されたすべての文字が逆順で含まれます。
(setq last-output nil)
⇒ nil
(defun eat-output (c)
(setq last-output (cons c last-output)))
⇒ eat-output
(print "This is the output" 'eat-output)
⇒ "This is the output"
last-output
⇒ (10 34 116 117 112 116 117 111 32 101 104
116 32 115 105 32 115 105 104 84 34 10)
このリストを逆転すれば、正しい順序で出力することができます:
(concat (nreverse last-output))
⇒ "
\"This is the output\"
"
concatを呼び出してリストを文字列に変換すれば、内容をより明解に確認できます。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、オブジェクトをオブジェクトのプリント表現に変換してLispオブジェクトをプリントするLisp関数を説明します。
Emacsプリント関数には、正しく読み取れるように必要なとき出力にクォート文字を追加するものがあります。使用されるクォート文字は‘"’と‘\’です。これらは文字列をシンボルと区別するとともに、文字列およびシンボル内の区切り文字が読み取り時に区切り文字として扱われることを防ぎます。完全な詳細はPrinted Representation and Read Syntaxを参照してください。クォートするかしないかは、プリント関数の選択により指定できます。
そのテキストがLispに読み戻す場合、同様にLispプログラマーにLispオブジェクトを明解に説明するのが目的の場合は、曖昧さを避けるためにクォート文字をプリントするべきです。しかし、プログラマー以外の人間にたいして出力の見栄えを良くするのが目的なら、通常はクォートなしでプリントしたほうがよいでしょう。
Lispオブジェクトは自己参照ができます。通常の方法で自己参照オブジェクトをプリントするにはテキストが無限に必要で、その試みにより無限再帰が発生する恐れがあります。Emacsはそのような再帰を検知して、すでにプリントされたオブジェクトを再帰的にプリントするかわりに、‘#level’をプリントします。たとえば以下は、カレントのプリント処理において、レベル0のオブジェクトを再帰的に参照することを示しています:
(setq foo (list nil))
⇒ (nil)
(setcar foo foo)
⇒ (#0)
以下の関数では、streamは出力ストリームを意味します。(出力ストリームの説明は、前のセクションを参照してください。)
streamがnil、または省略された場合のデフォルトは、standard-outputの値になります。
print関数は、プリントを行うための便利な方法である。この関数はobjectの前後に改行を付与して、objectのプリント表現をstreamにプリントする。クォート文字が使用される。printはobjectをリターンする。たとえば:
(progn (print 'The\ cat\ in)
(print "the hat")
(print " came back"))
-|
-| The\ cat\ in
-|
-| "the hat"
-|
-| " came back"
⇒ " came back"
この関数はobjectのプリント表現をstreamに出力する。この関数はprintのように出力を分割するための改行をプリントしないが、printのようにクォート文字を使用する。objectをリターンする。
(progn (prin1 'The\ cat\ in)
(prin1 "the hat")
(prin1 " came back"))
-| The\ cat\ in"the hat"" came back"
⇒ " came back"
この関数はobjectのプリント表現をstreamに出力する。objectをリターンする。
この関数はreadではなく人間が読める出力を生成することを意図しているので、クォート文字を挿入せず、文字列のコンテンツの前後にダブルクォート文字を配さない。呼び出しの間に間隔を何も出力しない。
(progn
(princ 'The\ cat)
(princ " in the \"hat\""))
-| The cat in the "hat"
⇒ " in the \"hat\""
この関数はstreamに改行を出力する。名前の由来は、“terminate print”である。
この関数はcharacterをstreamに出力する。characterをリターンする。
この関数は、同じ引数でprin1がプリントするテキストを含む文字列をリターンする。
(prin1-to-string 'foo)
⇒ "foo"
(prin1-to-string (mark-marker))
⇒ "#<marker at 2773 in strings.texi>"
noescapeが非nilの場合は、出力中のクォート文字の使用を抑制する。(この引数は、Emacsバージョン19以降でサポートされた。)
(prin1-to-string "foo")
⇒ "\"foo\""
(prin1-to-string "foo" t)
⇒ "foo"
Lispオブジェクトのプリント表現を文字列として取得する別の手段については、Formatting Stringsのformatを参照のこと。
このマクロは出力を文字列に送るようstandard-outputをセットアップして、フォームbodyを実行する。その文字列がリターンされる。
たとえばカレントバッファー名が‘foo’の場合、
(with-output-to-string (princ "The buffer is ") (princ (buffer-name)))
は"The buffer is foo"をリターンする。
この関数はprin1と同じようにobjectをstreamに出力するが、より“優雅(pretty)”な方法でこれを行う。すなわち、この関数は人間がより読みやすいようにオブジェクトのインデントとパディングを行う。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この変数の値はデフォルト出力ストリーム(stream引数がnilのときプリント関数が使用するストリーム)である。デフォルトはtで、エコーエリアに表示することを意味する。
これが非nilの場合は、省略されたリーダー構文(たとえば(quote
foo)を'foo、(function
foo)を#'fooのように)を使用してクォートされたフォームをプリントすることを意味する。
この変数が非nilの場合、文字列内の改行は‘\n’、改ページは‘\f’でプリントされる。これらの文字は、通常は実際の改行および改ページとしてプリントされる。
この変数はクォートつきのプリントを行うプリント関数prin1およびprintに影響を与える。princに影響はない。以下はprin1を使用した場合の例である:
(prin1 "a\nb")
-| "a
-| b"
⇒ "a
b"
(let ((print-escape-newlines t))
(prin1 "a\nb"))
-| "a\nb"
⇒ "a
b"
2つ目の式では、prin1を呼び出す間はprint-escape-newlinesのローカルバインドが効果をもつが、結果をプリントするときには効果がない。
この変数が非nilの場合、クォートつきでプリントするプリント関数prin1およびprintは、文字列内のユニバイトの非ASCII文字を無条件でバックスラッシュシーケンスとしてプリントする。
これらの関数は、出力ストリームがマルチバイトバッファー、あるいはマーカーがマルチバイトバッファーをポイントするときは、この変数の値に関わらずユニバイト非ASCII文字にたいしてバックスラッシュシーケンスを使用する。
この変数が非nilの場合、クォートつきでプリントするプリント関数prin1およびprintは、文字列内のマルチバイトの非ASCII文字を無条件でバックスラッシュシーケンスとしてプリントする。
これらの関数は、出力ストリームがユニバイトバッファー、あるいはマーカーがユニバイトバッファーをポイントするときは、この変数の値に関わらずマルチバイト非ASCII文字にたいしてバックスラッシュシーケンスを使用する。
この変数の値は任意のリスト、ベクター、ブールベクターをプリントする際の最大要素数である。プリントされるオブジェクトがこれより多くの要素をもつ場合は、省略記号(“...”)で省略される。
値がnil(デフォルト)の場合は、無制限である。
(setq print-length 2)
⇒ 2
(print '(1 2 3 4 5))
-| (1 2 ...)
⇒ (1 2 ...)
この変数の値はプリント時の丸カッコ(parentheses: “()”)と角カッコ(brackets:
“[]"’)のネスト最大深さである。この制限を超える任意のリストまたはベクターは省略記号(“...”)で省略される。値nil(デフォルト)は無制限を意味する。
これらはeval-expressionにより使用されるprint-lengthおよびprint-levelの値であり、したがって間接的に多くのインタラクティブな評価コマンドにより使用される(Evaluating Emacs-Lisp Expressions in The GNU Emacs Manualを参照)。
以下の変数は循環構造および共有構造の検出と報告に使用されます:
非nilの場合、この変数はプリント時の循環構造と共有構造の検出を有効にする。Read Syntax for Circular Objectsを参照のこと。
非nilの場合、この変数はプリント時のインターンされていないシンボル(Creating and Interning Symbolsを参照)の検出を有効にする。これが有効な場合、インターンされていないシンボルはプレフィックス‘#:’とともにプリントされる。このプレフィックスは、Lispリーダーにたいしてインターンされていないシンボルを生成するよう告げる。
非nilの場合は、複数のプリント呼び出しを通じて通番が振られることを意味する。これは‘#n=’ラベルおよび‘#m#’参照にたいしてプリントされる数字に影響する。この変数をsetqでセットしてはならない。letを使用して一時的にtにバインドするべきである。これを行う場合は、print-number-tableもnilにバインドするべきである。
この変数はprint-circle機能を実装するために、プリント処理で内部的に使用されるベクターを保持する。print-continuous-numberingをバインドするときにこの変数をnilにバインドする以外は、この変数を使用するべきではない。
この変数は浮動小数点数をプリントする方法を指定する。デフォルトはnilで、これは情報を失わずにその数値を表せるもっとも短い出力を使用することを意味する。
出力フォーマットをより精密に制御するために、この変数に文字列をセットできる。この文字列にはCのsprintf関数で使用される‘%’指定子をセットする。この変数で使用することのできる制限についての詳細は、この変数のドキュメント文字列を参照のこと。
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A minibuffer is a special buffer that Emacs commands use to read arguments more complicated than the single numeric prefix argument. These arguments include file names, buffer names, and command names (as in M-x). The minibuffer is displayed on the bottom line of the frame, in the same place as the echo area (see section The Echo Area), but only while it is in use for reading an argument.
| 19.1 Introduction to Minibuffers | Basic information about minibuffers. | |
| 19.2 Reading Text Strings with the Minibuffer | How to read a straight text string. | |
| 19.3 Reading Lisp Objects with the Minibuffer | How to read a Lisp object or expression. | |
| 19.4 Minibuffer History | Recording previous minibuffer inputs so the user can reuse them. | |
| 19.5 Initial Input | Specifying initial contents for the minibuffer. | |
| 19.6 Completion | How to invoke and customize completion. | |
| 19.7 Yes-or-No Queries | Asking a question with a simple answer. | |
| 19.8 Asking Multiple Y-or-N Questions | Asking a series of similar questions. | |
| 19.9 Reading a Password | Reading a password from the terminal. | |
| 19.10 Minibuffer Commands | Commands used as key bindings in minibuffers. | |
| 19.11 Minibuffer Windows | Operating on the special minibuffer windows. | |
| 19.12 Minibuffer Contents | How such commands access the minibuffer text. | |
| 19.13 Recursive Minibuffers | Whether recursive entry to minibuffer is allowed. | |
| 19.14 Minibuffer Miscellany | Various customization hooks and variables. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In most ways, a minibuffer is a normal Emacs buffer. Most operations within a buffer, such as editing commands, work normally in a minibuffer. However, many operations for managing buffers do not apply to minibuffers. The name of a minibuffer always has the form ‘ *Minibuf-number*’, and it cannot be changed. Minibuffers are displayed only in special windows used only for minibuffers; these windows always appear at the bottom of a frame. (Sometimes frames have no minibuffer window, and sometimes a special kind of frame contains nothing but a minibuffer window; see Minibuffers and Frames.)
The text in the minibuffer always starts with the prompt string,
the text that was specified by the program that is using the minibuffer
to tell the user what sort of input to type. This text is marked
read-only so you won’t accidentally delete or change it. It is also
marked as a field (see section Defining and Using Fields), so that certain motion functions,
including beginning-of-line, forward-word,
forward-sentence, and forward-paragraph, stop at the
boundary between the prompt and the actual text.
The minibuffer’s window is normally a single line; it grows
automatically if the contents require more space. Whilst it is
active, you can explicitly resize it temporarily with the window
sizing commands; it reverts to its normal size when the minibuffer is
exited. When the minibuffer is not active, you can resize it
permanently by using the window sizing commands in the frame’s other
window, or dragging the mode line with the mouse. (Due to details of
the current implementation, for this to work resize-mini-windows
must be nil.) If the frame contains just a minibuffer, you can
change the minibuffer’s size by changing the frame’s size.
Use of the minibuffer reads input events, and that alters the values
of variables such as this-command and last-command
(see section Information from the Command Loop). Your program should bind them around the
code that uses the minibuffer, if you do not want that to change them.
Under some circumstances, a command can use a minibuffer even if
there is an active minibuffer; such a minibuffer is called a
recursive minibuffer. The first minibuffer is named
‘ *Minibuf-1*’. Recursive minibuffers are named by
incrementing the number at the end of the name. (The names begin with
a space so that they won’t show up in normal buffer lists.) Of
several recursive minibuffers, the innermost (or most recently
entered) is the active minibuffer. We usually call this “the”
minibuffer. You can permit or forbid recursive minibuffers by setting
the variable enable-recursive-minibuffers, or by putting
properties of that name on command symbols (See section Recursive Minibuffers.)
Like other buffers, a minibuffer uses a local keymap (see section Keymaps) to specify special key bindings. The function that invokes the minibuffer also sets up its local map according to the job to be done. See section Reading Text Strings with the Minibuffer, for the non-completion minibuffer local maps. See section Minibuffer Commands that Do Completion, for the minibuffer local maps for completion.
When a minibuffer is inactive, its major mode is
minibuffer-inactive-mode, with keymap
minibuffer-inactive-mode-map. This is only really useful if
the minibuffer is in a separate frame. See section Minibuffers and Frames.
When Emacs is running in batch mode, any request to read from the minibuffer actually reads a line from the standard input descriptor that was supplied when Emacs was started. This supports only basic input: none of the special minibuffer features (history, completion, password hiding, etc.) are available in batch mode.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The most basic primitive for minibuffer input is
read-from-minibuffer, which can be used to read either a string
or a Lisp object in textual form. The function read-regexp is
used for reading regular expressions (see section Regular Expressions),
which are a special kind of string. There are also specialized
functions for reading commands, variables, file names, etc.
(see section Completion).
In most cases, you should not call minibuffer input functions in the
middle of a Lisp function. Instead, do all minibuffer input as part of
reading the arguments for a command, in the interactive
specification. See section Defining Commands.
This function is the most general way to get input from the
minibuffer. By default, it accepts arbitrary text and returns it as a
string; however, if read is non-nil, then it uses
read to convert the text into a Lisp object (see section Input Functions).
The first thing this function does is to activate a minibuffer and display it with prompt (which must be a string) as the prompt. Then the user can edit text in the minibuffer.
When the user types a command to exit the minibuffer,
read-from-minibuffer constructs the return value from the text in
the minibuffer. Normally it returns a string containing that text.
However, if read is non-nil, read-from-minibuffer
reads the text and returns the resulting Lisp object, unevaluated.
(See section Input Functions, for information about reading.)
The argument default specifies default values to make available
through the history commands. It should be a string, a list of
strings, or nil. The string or strings become the minibuffer’s
“future history”, available to the user with M-n.
If read is non-nil, then default is also used
as the input to read, if the user enters empty input.
If default is a list of strings, the first string is used as the input.
If default is nil, empty input results in an end-of-file error.
However, in the usual case (where read is nil),
read-from-minibuffer ignores default when the user enters
empty input and returns an empty string, "". In this respect,
it differs from all the other minibuffer input functions in this chapter.
If keymap is non-nil, that keymap is the local keymap to
use in the minibuffer. If keymap is omitted or nil, the
value of minibuffer-local-map is used as the keymap. Specifying
a keymap is the most important way to customize the minibuffer for
various applications such as completion.
The argument history specifies a history list variable to use
for saving the input and for history commands used in the minibuffer.
It defaults to minibuffer-history. You can optionally specify
a starting position in the history list as well. See section Minibuffer History.
If the variable minibuffer-allow-text-properties is
non-nil, then the string that is returned includes whatever text
properties were present in the minibuffer. Otherwise all the text
properties are stripped when the value is returned.
If the argument inherit-input-method is non-nil, then the
minibuffer inherits the current input method (see section Input Methods) and
the setting of enable-multibyte-characters (see section Text Representations) from whichever buffer was current before entering the
minibuffer.
Use of initial is mostly deprecated; we recommend using
a non-nil value only in conjunction with specifying a cons cell
for history. See section Initial Input.
This function reads a string from the minibuffer and returns it. The
arguments prompt, initial, history and
inherit-input-method are used as in read-from-minibuffer.
The keymap used is minibuffer-local-map.
The optional argument default is used as in
read-from-minibuffer, except that, if non-nil, it also
specifies a default value to return if the user enters null input. As
in read-from-minibuffer it should be a string, a list of
strings, or nil, which is equivalent to an empty string. When
default is a string, that string is the default value. When it
is a list of strings, the first string is the default value. (All
these strings are available to the user in the “future minibuffer
history”.)
This function works by calling the
read-from-minibuffer function:
(read-string prompt initial history default inherit)
≡
(let ((value
(read-from-minibuffer prompt initial nil nil
history default inherit)))
(if (and (equal value "") default)
(if (consp default) (car default) default)
value))
This function reads a regular expression as a string from the minibuffer and returns it. If the minibuffer prompt string prompt does not end in ‘:’ (followed by optional whitespace), the function adds ‘: ’ to the end, preceded by the default return value (see below), if that is non-empty.
The optional argument defaults controls the default value to
return if the user enters null input, and should be one of: a string;
nil, which is equivalent to an empty string; a list of strings;
or a symbol.
If defaults is a symbol, read-regexp consults the value
of the variable read-regexp-defaults-function (see below), and
if that is non-nil uses it in preference to defaults.
The value in this case should be either:
regexp-history-last, which means to use the first element of
the appropriate minibuffer history list (see below).
nil, a string, or a list of strings) becomes the value of
defaults.
read-regexp now ensures that the result of processing
defaults is a list (i.e., if the value is nil or a
string, it converts it to a list of one element). To this list,
read-regexp then appends a few potentially useful candidates for
input. These are:
The function now has a list of regular expressions that it passes to
read-from-minibuffer to obtain the user’s input. The first
element of the list is the default result in case of empty input. All
elements of the list are available to the user as the “future
minibuffer history list” (see future list in The GNU Emacs Manual).
The optional argument history, if non-nil, is a symbol
specifying a minibuffer history list to use (see section Minibuffer History). If it is omitted or nil, the history list defaults
to regexp-history.
The function read-regexp may use the value of this variable to
determine its list of default regular expressions. If non-nil,
the value of this variable should be either:
regexp-history-last.
nil, a string,
or a list of strings.
See read-regexp above for details of how these values are used.
If this variable is nil, then read-from-minibuffer
and read-string strip all text properties from the minibuffer
input before returning it. However,
read-no-blanks-input (see below), as well as
read-minibuffer and related functions (see section Reading Lisp Objects With the Minibuffer), and all
functions that do minibuffer input with completion, discard text
properties unconditionally, regardless of the value of this variable.
This is the default local keymap for reading from the minibuffer. By default, it makes the following bindings:
exit-minibuffer
exit-minibuffer
abort-recursive-edit
next-history-element
previous-history-element
next-matching-history-element
previous-matching-history-element
This function reads a string from the minibuffer, but does not allow
whitespace characters as part of the input: instead, those characters
terminate the input. The arguments prompt, initial, and
inherit-input-method are used as in read-from-minibuffer.
This is a simplified interface to the read-from-minibuffer
function, and passes the value of the minibuffer-local-ns-map
keymap as the keymap argument for that function. Since the keymap
minibuffer-local-ns-map does not rebind C-q, it is
possible to put a space into the string, by quoting it.
This function discards text properties, regardless of the value of
minibuffer-allow-text-properties.
(read-no-blanks-input prompt initial) ≡ (let (minibuffer-allow-text-properties) (read-from-minibuffer prompt initial minibuffer-local-ns-map))
This built-in variable is the keymap used as the minibuffer local keymap
in the function read-no-blanks-input. By default, it makes the
following bindings, in addition to those of minibuffer-local-map:
exit-minibuffer
exit-minibuffer
self-insert-and-exit
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes functions for reading Lisp objects with the minibuffer.
This function reads a Lisp object using the minibuffer, and returns it
without evaluating it. The arguments prompt and initial are
used as in read-from-minibuffer.
This is a simplified interface to the
read-from-minibuffer function:
(read-minibuffer prompt initial) ≡ (let (minibuffer-allow-text-properties) (read-from-minibuffer prompt initial nil t))
Here is an example in which we supply the string "(testing)" as
initial input:
(read-minibuffer
"Enter an expression: " (format "%s" '(testing)))
;; Here is how the minibuffer is displayed:
---------- Buffer: Minibuffer ---------- Enter an expression: (testing)∗ ---------- Buffer: Minibuffer ----------
The user can type RET immediately to use the initial input as a default, or can edit the input.
This function reads a Lisp expression using the minibuffer, evaluates
it, then returns the result. The arguments prompt and
initial are used as in read-from-minibuffer.
This function simply evaluates the result of a call to
read-minibuffer:
(eval-minibuffer prompt initial) ≡ (eval (read-minibuffer prompt initial))
This function reads a Lisp expression in the minibuffer, evaluates it,
then returns the result. The difference between this command and
eval-minibuffer is that here the initial form is not
optional and it is treated as a Lisp object to be converted to printed
representation rather than as a string of text. It is printed with
prin1, so if it is a string, double-quote characters (‘"’)
appear in the initial text. See section Output Functions.
In the following example, we offer the user an expression with initial text that is already a valid form:
(edit-and-eval-command "Please edit: " '(forward-word 1)) ;; After evaluation of the preceding expression, ;; the following appears in the minibuffer:
---------- Buffer: Minibuffer ---------- Please edit: (forward-word 1)∗ ---------- Buffer: Minibuffer ----------
Typing RET right away would exit the minibuffer and evaluate the expression, thus moving point forward one word.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A minibuffer history list records previous minibuffer inputs so the user can reuse them conveniently. It is a variable whose value is a list of strings (previous inputs), most recent first.
There are many separate minibuffer history lists, used for different kinds of inputs. It’s the Lisp programmer’s job to specify the right history list for each use of the minibuffer.
You specify a minibuffer history list with the optional history
argument to read-from-minibuffer or completing-read.
Here are the possible values for it:
Use variable (a symbol) as the history list.
Use variable (a symbol) as the history list, and assume that the initial history position is startpos (a nonnegative integer).
Specifying 0 for startpos is equivalent to just specifying the
symbol variable. previous-history-element will display
the most recent element of the history list in the minibuffer. If you
specify a positive startpos, the minibuffer history functions
behave as if (elt variable (1- startpos)) were the
history element currently shown in the minibuffer.
For consistency, you should also specify that element of the history as the initial minibuffer contents, using the initial argument to the minibuffer input function (see section Initial Input).
If you don’t specify history, then the default history list
minibuffer-history is used. For other standard history lists,
see below. You can also create your own history list variable; just
initialize it to nil before the first use.
Both read-from-minibuffer and completing-read add new
elements to the history list automatically, and provide commands to
allow the user to reuse items on the list. The only thing your program
needs to do to use a history list is to initialize it and to pass its
name to the input functions when you wish. But it is safe to modify the
list by hand when the minibuffer input functions are not using it.
Emacs functions that add a new element to a history list can also
delete old elements if the list gets too long. The variable
history-length specifies the maximum length for most history
lists. To specify a different maximum length for a particular history
list, put the length in the history-length property of the
history list symbol. The variable history-delete-duplicates
specifies whether to delete duplicates in history.
This function adds a new element newelt, if it isn’t the empty
string, to the history list stored in the variable history-var,
and returns the updated history list. It limits the list length to
the value of maxelt (if non-nil) or history-length
(described below). The possible values of maxelt have the same
meaning as the values of history-length.
Normally, add-to-history removes duplicate members from the
history list if history-delete-duplicates is non-nil.
However, if keep-all is non-nil, that says not to remove
duplicates, and to add newelt to the list even if it is empty.
If the value of this variable is nil, standard functions that
read from the minibuffer don’t add new elements to the history list.
This lets Lisp programs explicitly manage input history by using
add-to-history. The default value is t.
The value of this variable specifies the maximum length for all
history lists that don’t specify their own maximum lengths. If the
value is t, that means there is no maximum (don’t delete old
elements). If a history list variable’s symbol has a non-nil
history-length property, it overrides this variable for that
particular history list.
If the value of this variable is t, that means when adding a
new history element, all previous identical elements are deleted.
Here are some of the standard minibuffer history list variables:
The default history list for minibuffer history input.
A history list for arguments to query-replace (and similar
arguments to other commands).
A history list for file-name arguments.
A history list for buffer-name arguments.
A history list for regular expression arguments.
A history list for arguments that are names of extended commands.
A history list for arguments that are shell commands.
A history list for arguments that are Lisp expressions to evaluate.
A history list for arguments that are faces.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Several of the functions for minibuffer input have an argument called initial. This is a mostly-deprecated feature for specifying that the minibuffer should start out with certain text, instead of empty as usual.
If initial is a string, the minibuffer starts out containing the text of the string, with point at the end, when the user starts to edit the text. If the user simply types RET to exit the minibuffer, it will use the initial input string to determine the value to return.
We discourage use of a non-nil value for
initial, because initial input is an intrusive interface.
History lists and default values provide a much more convenient method
to offer useful default inputs to the user.
There is just one situation where you should specify a string for an initial argument. This is when you specify a cons cell for the history argument. See section Minibuffer History.
initial can also be a cons cell of the form (string
. position). This means to insert string in the
minibuffer but put point at position within the string’s text.
As a historical accident, position was implemented
inconsistently in different functions. In completing-read,
position’s value is interpreted as origin-zero; that is, a value
of 0 means the beginning of the string, 1 means after the first
character, etc. In read-minibuffer, and the other
non-completion minibuffer input functions that support this argument,
1 means the beginning of the string, 2 means after the first character,
etc.
Use of a cons cell as the value for initial arguments is deprecated.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Completion is a feature that fills in the rest of a name
starting from an abbreviation for it. Completion works by comparing the
user’s input against a list of valid names and determining how much of
the name is determined uniquely by what the user has typed. For
example, when you type C-x b (switch-to-buffer) and then
type the first few letters of the name of the buffer to which you wish
to switch, and then type TAB (minibuffer-complete), Emacs
extends the name as far as it can.
Standard Emacs commands offer completion for names of symbols, files, buffers, and processes; with the functions in this section, you can implement completion for other kinds of names.
The try-completion function is the basic primitive for
completion: it returns the longest determined completion of a given
initial string, with a given set of strings to match against.
The function completing-read provides a higher-level interface
for completion. A call to completing-read specifies how to
determine the list of valid names. The function then activates the
minibuffer with a local keymap that binds a few keys to commands useful
for completion. Other functions provide convenient simple interfaces
for reading certain kinds of names with completion.
| 19.6.1 Basic Completion Functions | Low-level functions for completing strings. | |
| 19.6.2 Completion and the Minibuffer | Invoking the minibuffer with completion. | |
| 19.6.3 Minibuffer Commands that Do Completion | Minibuffer commands that do completion. | |
| 19.6.4 High-Level Completion Functions | Convenient special cases of completion (reading buffer names, variable names, etc.). | |
| 19.6.5 Reading File Names | Using completion to read file names and shell commands. | |
| 19.6.6 Completion Variables | Variables controlling completion behavior. | |
| 19.6.7 Programmed Completion | Writing your own completion function. | |
| 19.6.8 Completion in Ordinary Buffers | Completing text in ordinary buffers. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The following completion functions have nothing in themselves to do with minibuffers. We describe them here to keep them near the higher-level completion features that do use the minibuffer.
This function returns the longest common substring of all possible completions of string in collection.
collection is called the completion table. Its value must be a list of strings or cons cells, an obarray, a hash table, or a completion function.
try-completion compares string against each of the
permissible completions specified by the completion table. If no
permissible completions match, it returns nil. If there is
just one matching completion, and the match is exact, it returns
t. Otherwise, it returns the longest initial sequence common
to all possible matching completions.
If collection is a list, the permissible completions are
specified by the elements of the list, each of which should be either
a string, or a cons cell whose CAR is either a string or a symbol
(a symbol is converted to a string using symbol-name). If the
list contains elements of any other type, those are ignored.
If collection is an obarray (see section Creating and Interning Symbols), the names of all symbols in the obarray form the set of permissible completions.
If collection is a hash table, then the keys that are strings are the possible completions. Other keys are ignored.
You can also use a function as collection. Then the function is
solely responsible for performing completion; try-completion
returns whatever this function returns. The function is called with
three arguments: string, predicate and nil (the
third argument is so that the same function can be used
in all-completions and do the appropriate thing in either
case). See section Programmed Completion.
If the argument predicate is non-nil, then it must be a
function of one argument, unless collection is a hash table, in
which case it should be a function of two arguments. It is used to
test each possible match, and the match is accepted only if
predicate returns non-nil. The argument given to
predicate is either a string or a cons cell (the CAR of
which is a string) from the alist, or a symbol (not a symbol
name) from the obarray. If collection is a hash table,
predicate is called with two arguments, the string key and the
associated value.
In addition, to be acceptable, a completion must also match all the
regular expressions in completion-regexp-list. (Unless
collection is a function, in which case that function has to
handle completion-regexp-list itself.)
In the first of the following examples, the string ‘foo’ is
matched by three of the alist CARs. All of the matches begin with
the characters ‘fooba’, so that is the result. In the second
example, there is only one possible match, and it is exact, so the
return value is t.
(try-completion
"foo"
'(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4)))
⇒ "fooba"
(try-completion "foo" '(("barfoo" 2) ("foo" 3)))
⇒ t
In the following example, numerous symbols begin with the characters ‘forw’, and all of them begin with the word ‘forward’. In most of the symbols, this is followed with a ‘-’, but not in all, so no more than ‘forward’ can be completed.
(try-completion "forw" obarray)
⇒ "forward"
Finally, in the following example, only two of the three possible
matches pass the predicate test (the string ‘foobaz’ is
too short). Both of those begin with the string ‘foobar’.
(defun test (s)
(> (length (car s)) 6))
⇒ test
(try-completion
"foo"
'(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))
'test)
⇒ "foobar"
This function returns a list of all possible completions of
string. The arguments to this function
are the same as those of try-completion, and it
uses completion-regexp-list in the same way that
try-completion does.
If collection is a function, it is called with three arguments:
string, predicate and t; then all-completions
returns whatever the function returns. See section Programmed Completion.
Here is an example, using the function test shown in the
example for try-completion:
(defun test (s)
(> (length (car s)) 6))
⇒ test
(all-completions
"foo"
'(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))
'test)
⇒ ("foobar1" "foobar2")
This function returns non-nil if string is a valid
completion alternative specified by collection and
predicate. The arguments are the same as in
try-completion. For instance, if collection is a list of
strings, this is true if string appears in the list and
predicate is satisfied.
This function uses completion-regexp-list in the same
way that try-completion does.
If predicate is non-nil and if collection contains
several strings that are equal to each other, as determined by
compare-strings according to completion-ignore-case,
then predicate should accept either all or none of them.
Otherwise, the return value of test-completion is essentially
unpredictable.
If collection is a function, it is called with three arguments,
the values string, predicate and lambda; whatever
it returns, test-completion returns in turn.
This function returns the boundaries of the field on which collection will operate, assuming that string holds the text before point and suffix holds the text after point.
Normally completion operates on the whole string, so for all normal
collections, this will always return (0 . (length
suffix)). But more complex completion such as completion on
files is done one field at a time. For example, completion of
"/usr/sh" will include "/usr/share/" but not
"/usr/share/doc" even if "/usr/share/doc" exists.
Also all-completions on "/usr/sh" will not include
"/usr/share/" but only "share/". So if string is
"/usr/sh" and suffix is "e/doc",
completion-boundaries will return (5 . 1) which tells us
that the collection will only return completion information that
pertains to the area after "/usr/" and before "/doc".
If you store a completion alist in a variable, you should mark the
variable as “risky” by giving it a non-nil
risky-local-variable property. See section File Local Variables.
If the value of this variable is non-nil, case is not
considered significant in completion. Within read-file-name,
this variable is overridden by
read-file-name-completion-ignore-case (see section Reading File Names); within read-buffer, it is overridden by
read-buffer-completion-ignore-case (see section High-Level Completion Functions).
This is a list of regular expressions. The completion functions only
consider a completion acceptable if it matches all regular expressions
in this list, with case-fold-search (see section Searching and Case)
bound to the value of completion-ignore-case.
This macro provides a way to initialize the variable var as a collection for completion in a lazy way, not computing its actual contents until they are first needed. You use this macro to produce a value that you store in var. The actual computation of the proper value is done the first time you do completion using var. It is done by calling fun with no arguments. The value fun returns becomes the permanent value of var.
Here is an example:
(defvar foo (lazy-completion-table foo make-my-alist))
There are several functions that take an existing completion table and
return a modified version. completion-table-case-fold returns
a case-insensitive table. completion-table-in-turn and
completion-table-merge combine multiple input tables in
different ways. completion-table-subvert alters a table to use
a different initial prefix. completion-table-with-quoting
returns a table suitable for operating on quoted text.
completion-table-with-predicate filters a table with a
predicate function. completion-table-with-terminator adds a
terminating string.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes the basic interface for reading from the minibuffer with completion.
This function reads a string in the minibuffer, assisting the user by providing completion. It activates the minibuffer with prompt prompt, which must be a string.
The actual completion is done by passing the completion table
collection and the completion predicate predicate to the
function try-completion (see section Basic Completion Functions). This
happens in certain commands bound in the local keymaps used for
completion. Some of these commands also call test-completion.
Thus, if predicate is non-nil, it should be compatible
with collection and completion-ignore-case.
See Definition of test-completion.
The value of the optional argument require-match determines how the user may exit the minibuffer:
nil, the usual minibuffer exit commands work regardless of
the input in the minibuffer.
t, the usual minibuffer exit commands won’t exit unless the
input completes to an element of collection.
confirm, the user can exit with any input, but is asked for
confirmation if the input is not an element of collection.
confirm-after-completion, the user can exit with any input,
but is asked for confirmation if the preceding command was a
completion command (i.e., one of the commands in
minibuffer-confirm-exit-commands) and the resulting input is
not an element of collection. See section Minibuffer Commands that Do Completion.
t, except
that the exit commands won’t exit if it performs completion.
However, empty input is always permitted, regardless of the value of
require-match; in that case, completing-read returns the
first element of default, if it is a list; "", if
default is nil; or default. The string or strings
in default are also available to the user through the history
commands.
The function completing-read uses
minibuffer-local-completion-map as the keymap if
require-match is nil, and uses
minibuffer-local-must-match-map if require-match is
non-nil. See section Minibuffer Commands that Do Completion.
The argument history specifies which history list variable to use for
saving the input and for minibuffer history commands. It defaults to
minibuffer-history. See section Minibuffer History.
The argument initial is mostly deprecated; we recommend using a
non-nil value only in conjunction with specifying a cons cell
for history. See section Initial Input. For default input, use
default instead.
If the argument inherit-input-method is non-nil, then the
minibuffer inherits the current input method (see section Input Methods) and the setting of enable-multibyte-characters
(see section Text Representations) from whichever buffer was current before
entering the minibuffer.
If the variable completion-ignore-case is
non-nil, completion ignores case when comparing the input
against the possible matches. See section Basic Completion Functions. In this mode
of operation, predicate must also ignore case, or you will get
surprising results.
Here’s an example of using completing-read:
(completing-read
"Complete a foo: "
'(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))
nil t "fo")
;; After evaluation of the preceding expression, ;; the following appears in the minibuffer: ---------- Buffer: Minibuffer ---------- Complete a foo: fo∗ ---------- Buffer: Minibuffer ----------
If the user then types DEL DEL b RET,
completing-read returns barfoo.
The completing-read function binds variables to pass
information to the commands that actually do completion.
They are described in the following section.
The value of this variable must be a function, which is called by
completing-read to actually do its work. It should accept the
same arguments as completing-read. This can be bound to a
different function to completely override the normal behavior of
completing-read.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes the keymaps, commands and user options used in the minibuffer to do completion.
The value of this variable is the completion table used for completion
in the minibuffer. This is the global variable that contains what
completing-read passes to try-completion. It is used by
minibuffer completion commands such as
minibuffer-complete-word.
This variable’s value is the predicate that completing-read
passes to try-completion. The variable is also used by the other
minibuffer completion functions.
This variable determines whether Emacs asks for confirmation before
exiting the minibuffer; completing-read binds this variable,
and the function minibuffer-complete-and-exit checks the value
before exiting. If the value is nil, confirmation is not
required. If the value is confirm, the user may exit with an
input that is not a valid completion alternative, but Emacs asks for
confirmation. If the value is confirm-after-completion, the
user may exit with an input that is not a valid completion
alternative, but Emacs asks for confirmation if the user submitted the
input right after any of the completion commands in
minibuffer-confirm-exit-commands.
This variable holds a list of commands that cause Emacs to ask for
confirmation before exiting the minibuffer, if the require-match
argument to completing-read is confirm-after-completion.
The confirmation is requested if the user attempts to exit the
minibuffer immediately after calling any command in this list.
This function completes the minibuffer contents by at most a single
word. Even if the minibuffer contents have only one completion,
minibuffer-complete-word does not add any characters beyond the
first character that is not a word constituent. See section Syntax Tables.
This function completes the minibuffer contents as far as possible.
This function completes the minibuffer contents, and exits if
confirmation is not required, i.e., if
minibuffer-completion-confirm is nil. If confirmation
is required, it is given by repeating this command
immediately—the command is programmed to work without confirmation
when run twice in succession.
This function creates a list of the possible completions of the
current minibuffer contents. It works by calling all-completions
using the value of the variable minibuffer-completion-table as
the collection argument, and the value of
minibuffer-completion-predicate as the predicate argument.
The list of completions is displayed as text in a buffer named
*Completions*.
This function displays completions to the stream in
standard-output, usually a buffer. (See section Reading and Printing Lisp Objects, for more
information about streams.) The argument completions is normally
a list of completions just returned by all-completions, but it
does not have to be. Each element may be a symbol or a string, either
of which is simply printed. It can also be a list of two strings,
which is printed as if the strings were concatenated. The first of
the two strings is the actual completion, the second string serves as
annotation.
This function is called by minibuffer-completion-help. A
common way to use it is together with
with-output-to-temp-buffer, like this:
(with-output-to-temp-buffer "*Completions*"
(display-completion-list
(all-completions (buffer-string) my-alist)))
If this variable is non-nil, the completion commands
automatically display a list of possible completions whenever nothing
can be completed because the next character is not uniquely determined.
completing-read uses this value as the local keymap when an
exact match of one of the completions is not required. By default, this
keymap makes the following bindings:
minibuffer-completion-help
minibuffer-complete-word
minibuffer-complete
and uses minibuffer-local-map as its parent keymap
(see Definition of minibuffer-local-map).
completing-read uses this value as the local keymap when an
exact match of one of the completions is required. Therefore, no keys
are bound to exit-minibuffer, the command that exits the
minibuffer unconditionally. By default, this keymap makes the following
bindings:
minibuffer-complete-and-exit
minibuffer-complete-and-exit
and uses minibuffer-local-completion-map as its parent keymap.
This is a sparse keymap that simply unbinds SPC; because
filenames can contain spaces. The function read-file-name
combines this keymap with either minibuffer-local-completion-map
or minibuffer-local-must-match-map.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes the higher-level convenience functions for reading certain sorts of names with completion.
In most cases, you should not call these functions in the middle of a
Lisp function. When possible, do all minibuffer input as part of
reading the arguments for a command, in the interactive
specification. See section Defining Commands.
This function reads the name of a buffer and returns it as a string.
The argument default is the default name to use, the value to
return if the user exits with an empty minibuffer. If non-nil,
it should be a string, a list of strings, or a buffer. If it is
a list, the default value is the first element of this list. It is
mentioned in the prompt, but is not inserted in the minibuffer as
initial input.
The argument prompt should be a string ending with a colon and a
space. If default is non-nil, the function inserts it in
prompt before the colon to follow the convention for reading from
the minibuffer with a default value (see section Emacs Programming Tips).
The optional argument require-match has the same meaning as in
completing-read. See section Completion and the Minibuffer.
In the following example, the user enters ‘minibuffer.t’, and
then types RET. The argument require-match is t,
and the only buffer name starting with the given input is
‘minibuffer.texi’, so that name is the value.
(read-buffer "Buffer name: " "foo" t)
;; After evaluation of the preceding expression, ;; the following prompt appears, ;; with an empty minibuffer:
---------- Buffer: Minibuffer ---------- Buffer name (default foo): ∗ ---------- Buffer: Minibuffer ----------
;; The user types minibuffer.t RET.
⇒ "minibuffer.texi"
This variable, if non-nil, specifies a function for reading
buffer names. read-buffer calls this function instead of doing
its usual work, with the same arguments passed to read-buffer.
If this variable is non-nil, read-buffer ignores case
when performing completion.
This function reads the name of a command and returns it as a Lisp
symbol. The argument prompt is used as in
read-from-minibuffer. Recall that a command is anything for
which commandp returns t, and a command name is a symbol
for which commandp returns t. See section Interactive Call.
The argument default specifies what to return if the user enters
null input. It can be a symbol, a string or a list of strings. If it
is a string, read-command interns it before returning it.
If it is a list, read-command interns the first element of this list.
If default is nil, that means no default has been
specified; then if the user enters null input, the return value is
(intern ""), that is, a symbol whose name is an empty string.
(read-command "Command name? ")
;; After evaluation of the preceding expression, ;; the following prompt appears with an empty minibuffer:
---------- Buffer: Minibuffer ---------- Command name? ---------- Buffer: Minibuffer ----------
If the user types forward-c RET, then this function returns
forward-char.
The read-command function is a simplified interface to
completing-read. It uses the variable obarray so as to
complete in the set of extant Lisp symbols, and it uses the
commandp predicate so as to accept only command names:
(read-command prompt)
≡
(intern (completing-read prompt obarray
'commandp t nil))
This function reads the name of a customizable variable and returns it
as a symbol. Its arguments have the same form as those of
read-command. It behaves just like read-command, except
that it uses the predicate custom-variable-p instead of
commandp.
This function reads a string that is a color specification, either the
color’s name or an RGB hex value such as #RRRGGGBBB. It
prompts with prompt (default: "Color (name or #RGB triplet):")
and provides completion for color names, but not for hex RGB values.
In addition to names of standard colors, completion candidates include
the foreground and background colors at point.
Valid RGB values are described in Color Names.
The function’s return value is the string typed by the user in the
minibuffer. However, when called interactively or if the optional
argument convert is non-nil, it converts any input color
name into the corresponding RGB value string and instead returns that.
This function requires a valid color specification to be input.
Empty color names are allowed when allow-empty is
non-nil and the user enters null input.
Interactively, or when display is non-nil, the return
value is also displayed in the echo area.
See also the functions read-coding-system and
read-non-nil-coding-system, in User-Chosen Coding Systems,
and read-input-method-name, in Input Methods.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The high-level completion functions read-file-name,
read-directory-name, and read-shell-command are designed
to read file names, directory names, and shell commands, respectively.
They provide special features, including automatic insertion of the
default directory.
This function reads a file name, prompting with prompt and providing completion.
As an exception, this function reads a file name using a graphical file dialog instead of the minibuffer, if all of the following are true:
use-dialog-box is non-nil.
See Dialog Boxes in The GNU Emacs Manual.
The exact behavior when using a graphical file dialog is platform-dependent. Here, we simply document the behavior when using the minibuffer.
read-file-name does not automatically expand the returned file
name. You must call expand-file-name yourself if an absolute
file name is required.
The optional argument require-match has the same meaning as in
completing-read. See section Completion and the Minibuffer.
The argument directory specifies the directory to use for
completing relative file names. It should be an absolute directory
name. If the variable insert-default-directory is non-nil,
directory is also inserted in the minibuffer as initial input.
It defaults to the current buffer’s value of default-directory.
If you specify initial, that is an initial file name to insert
in the buffer (after directory, if that is inserted). In this
case, point goes at the beginning of initial. The default for
initial is nil—don’t insert any file name. To see what
initial does, try the command C-x C-v in a buffer visiting
a file. Please note: we recommend using default rather
than initial in most cases.
If default is non-nil, then the function returns
default if the user exits the minibuffer with the same non-empty
contents that read-file-name inserted initially. The initial
minibuffer contents are always non-empty if
insert-default-directory is non-nil, as it is by
default. default is not checked for validity, regardless of the
value of require-match. However, if require-match is
non-nil, the initial minibuffer contents should be a valid file
(or directory) name. Otherwise read-file-name attempts
completion if the user exits without any editing, and does not return
default. default is also available through the history
commands.
If default is nil, read-file-name tries to find a
substitute default to use in its place, which it treats in exactly the
same way as if it had been specified explicitly. If default is
nil, but initial is non-nil, then the default is
the absolute file name obtained from directory and
initial. If both default and initial are nil
and the buffer is visiting a file, read-file-name uses the
absolute file name of that file as default. If the buffer is not
visiting a file, then there is no default. In that case, if the user
types RET without any editing, read-file-name simply
returns the pre-inserted contents of the minibuffer.
If the user types RET in an empty minibuffer, this function returns an empty string, regardless of the value of require-match. This is, for instance, how the user can make the current buffer visit no file using M-x set-visited-file-name.
If predicate is non-nil, it specifies a function of one
argument that decides which file names are acceptable completion
alternatives. A file name is an acceptable value if predicate
returns non-nil for it.
Here is an example of using read-file-name:
(read-file-name "The file is ") ;; After evaluation of the preceding expression, ;; the following appears in the minibuffer:
---------- Buffer: Minibuffer ---------- The file is /gp/gnu/elisp/∗ ---------- Buffer: Minibuffer ----------
Typing manual TAB results in the following:
---------- Buffer: Minibuffer ---------- The file is /gp/gnu/elisp/manual.texi∗ ---------- Buffer: Minibuffer ----------
If the user types RET, read-file-name returns the file name
as the string "/gp/gnu/elisp/manual.texi".
If non-nil, this should be a function that accepts the same
arguments as read-file-name. When read-file-name is
called, it calls this function with the supplied arguments instead of
doing its usual work.
If this variable is non-nil, read-file-name ignores case
when performing completion.
This function is like read-file-name but allows only directory
names as completion alternatives.
If default is nil and initial is non-nil,
read-directory-name constructs a substitute default by
combining directory (or the current buffer’s default directory
if directory is nil) and initial. If both
default and initial are nil, this function uses
directory as substitute default, or the current buffer’s default
directory if directory is nil.
This variable is used by read-file-name, and thus, indirectly,
by most commands reading file names. (This includes all commands that
use the code letters ‘f’ or ‘F’ in their interactive form.
See section Code Characters for interactive.) Its
value controls whether read-file-name starts by placing the
name of the default directory in the minibuffer, plus the initial file
name, if any. If the value of this variable is nil, then
read-file-name does not place any initial input in the
minibuffer (unless you specify initial input with the initial
argument). In that case, the default directory is still used for
completion of relative file names, but is not displayed.
If this variable is nil and the initial minibuffer contents are
empty, the user may have to explicitly fetch the next history element
to access a default value. If the variable is non-nil, the
initial minibuffer contents are always non-empty and the user can
always request a default value by immediately typing RET in an
unedited minibuffer. (See above.)
For example:
;; Here the minibuffer starts out with the default directory.
(let ((insert-default-directory t))
(read-file-name "The file is "))
---------- Buffer: Minibuffer ---------- The file is ~lewis/manual/∗ ---------- Buffer: Minibuffer ----------
;; Here the minibuffer is empty and only the prompt ;; appears on its line. (let ((insert-default-directory nil)) (read-file-name "The file is "))
---------- Buffer: Minibuffer ---------- The file is ∗ ---------- Buffer: Minibuffer ----------
This function reads a shell command from the minibuffer, prompting with prompt and providing intelligent completion. It completes the first word of the command using candidates that are appropriate for command names, and the rest of the command words as file names.
This function uses minibuffer-local-shell-command-map as the
keymap for minibuffer input. The history argument specifies the
history list to use; if is omitted or nil, it defaults to
shell-command-history (see section shell-command-history). The optional argument initial
specifies the initial content of the minibuffer (see section Initial Input). The rest of args, if present, are used as the
default and inherit-input-method arguments in
read-from-minibuffer (see section Reading Text Strings with the Minibuffer).
This keymap is used by read-shell-command for completing
command and file names that are part of a shell command. It uses
minibuffer-local-map as its parent keymap, and binds TAB
to completion-at-point.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here are some variables that can be used to alter the default completion behavior.
The value of this variable is a list of completion style (symbols) to
use for performing completion. A completion style is a set of
rules for generating completions. Each symbol occurring this list
must have a corresponding entry in completion-styles-alist.
This variable stores a list of available completion styles. Each element in the list has the form
(style try-completion all-completions doc)
Here, style is the name of the completion style (a symbol),
which may be used in the completion-styles variable to refer to
this style; try-completion is the function that does the
completion; all-completions is the function that lists the
completions; and doc is a string describing the completion
style.
The try-completion and all-completions functions should
each accept four arguments: string, collection,
predicate, and point. The string, collection,
and predicate arguments have the same meanings as in
try-completion (see section Basic Completion Functions), and the point
argument is the position of point within string. Each function
should return a non-nil value if it performed its job, and
nil if it did not (e.g., if there is no way to complete
string according to the completion style).
When the user calls a completion command like
minibuffer-complete (see section Minibuffer Commands that Do Completion), Emacs looks
for the first style listed in completion-styles and calls its
try-completion function. If this function returns nil,
Emacs moves to the next listed completion style and calls its
try-completion function, and so on until one of the
try-completion functions successfully performs completion and
returns a non-nil value. A similar procedure is used for
listing completions, via the all-completions functions.
See Completion Styles in The GNU Emacs Manual, for a description of the available completion styles.
This variable specifies special completion styles and other completion
behaviors to use when completing certain types of text. Its value
should be an alist with elements of the form (category
. alist). category is a symbol describing what is being
completed; currently, the buffer, file, and
unicode-name categories are defined, but others can be defined
via specialized completion functions (see section Programmed Completion).
alist is an association list describing how completion should
behave for the corresponding category. The following alist keys are
supported:
stylesThe value should be a list of completion styles (symbols).
cycleThe value should be a value for completion-cycle-threshold
(see Completion Options in The GNU Emacs Manual) for this
category.
Additional alist entries may be defined in the future.
This variable is used to specify extra properties of the current completion command. It is intended to be let-bound by specialized completion commands. Its value should be a list of property and value pairs. The following properties are supported:
:annotation-functionThe value should be a function to add annotations in the completions
buffer. This function must accept one argument, a completion, and
should either return nil or a string to be displayed next to
the completion.
:exit-functionThe value should be a function to run after performing completion.
The function should accept two arguments, string and
status, where string is the text to which the field was
completed, and status indicates what kind of operation happened:
finished if text is now complete, sole if the text
cannot be further completed but completion is not finished, or
exact if the text is a valid completion but may be further
completed.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Sometimes it is not possible or convenient to create an alist or an obarray containing all the intended possible completions ahead of time. In such a case, you can supply your own function to compute the completion of a given string. This is called programmed completion. Emacs uses programmed completion when completing file names (see section File Name Completion), among many other cases.
To use this feature, pass a function as the collection
argument to completing-read. The function
completing-read arranges to pass your completion function along
to try-completion, all-completions, and other basic
completion functions, which will then let your function do all
the work.
The completion function should accept three arguments:
nil if none. The function should call the predicate for each
possible match, and ignore the match if the predicate returns
nil.
nilThis specifies a try-completion operation. The function should
return t if the specified string is a unique and exact match;
if there is more than one match, it should return the common substring
of all matches (if the string is an exact match for one completion
alternative but also matches other longer alternatives, the return
value is the string); if there are no matches, it should return
nil.
tThis specifies an all-completions operation. The function
should return a list of all possible completions of the specified
string.
lambdaThis specifies a test-completion operation. The function
should return t if the specified string is an exact match for
some completion alternative; nil otherwise.
(boundaries . suffix)This specifies a completion-boundaries operation. The function
should return (boundaries start . end), where
start is the position of the beginning boundary in the specified
string, and end is the position of the end boundary in
suffix.
metadataThis specifies a request for information about the state of the
current completion. The return value should have the form
(metadata . alist), where alist is an alist whose
elements are described below.
If the flag has any other value, the completion function should return
nil.
The following is a list of metadata entries that a completion function
may return in response to a metadata flag argument:
categoryThe value should be a symbol describing what kind of text the
completion function is trying to complete. If the symbol matches one
of the keys in completion-category-overrides, the usual
completion behavior is overridden. See section Completion Variables.
annotation-functionThe value should be a function for annotating completions. The function should take one argument, string, which is a possible completion. It should return a string, which is displayed after the completion string in the *Completions* buffer.
display-sort-functionThe value should be a function for sorting completions. The function should take one argument, a list of completion strings, and return a sorted list of completion strings. It is allowed to alter the input list destructively.
cycle-sort-functionThe value should be a function for sorting completions, when
completion-cycle-threshold is non-nil and the user is
cycling through completion alternatives. See Completion Options in The GNU Emacs Manual. Its argument list and return value are
the same as for display-sort-function.
This function is a convenient way to write a function that can act as
a programmed completion function. The argument function should be
a function that takes one argument, a string, and returns an alist of
possible completions of it. You can think of
completion-table-dynamic as a transducer between that interface
and the interface for programmed completion functions.
This is a wrapper for completion-table-dynamic that saves the
last argument-result pair. This means that multiple lookups with the
same argument only need to call function once. This can be useful
when a slow operation is involved, such as calling an external process.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Although completion is usually done in the minibuffer, the
completion facility can also be used on the text in ordinary Emacs
buffers. In many major modes, in-buffer completion is performed by
the C-M-i or M-TAB command, bound to
completion-at-point. See Symbol Completion in The GNU
Emacs Manual. This command uses the abnormal hook variable
completion-at-point-functions:
The value of this abnormal hook should be a list of functions, which are used to compute a completion table for completing the text at point. It can be used by major modes to provide mode-specific completion tables (see section Major Mode Conventions).
When the command completion-at-point runs, it calls the
functions in the list one by one, without any argument. Each function
should return nil if it is unable to produce a completion table
for the text at point. Otherwise it should return a list of the form
(start end collection . props)
start and end delimit the text to complete (which should
enclose point). collection is a completion table for completing
that text, in a form suitable for passing as the second argument to
try-completion (see section Basic Completion Functions); completion
alternatives will be generated from this completion table in the usual
way, via the completion styles defined in completion-styles
(see section Completion Variables). props is a property list for
additional information; any of the properties in
completion-extra-properties are recognized (see section Completion Variables), as well as the following additional ones:
:predicateThe value should be a predicate that completion candidates need to satisfy.
:exclusiveIf the value is no, then if the completion table fails to match
the text at point, completion-at-point moves on to the
next function in completion-at-point-functions instead of
reporting a completion failure.
A function in completion-at-point-functions may also return a
function. In that case, that returned function is called, with no
argument, and it is entirely responsible for performing the
completion. We discourage this usage; it is intended to help convert
old code to using completion-at-point.
The first function in completion-at-point-functions to return a
non-nil value is used by completion-at-point. The
remaining functions are not called. The exception to this is when
there is an :exclusive specification, as described above.
The following function provides a convenient way to perform completion on an arbitrary stretch of text in an Emacs buffer:
This function completes the text in the current buffer between the
positions start and end, using collection. The
argument collection has the same meaning as in
try-completion (see section Basic Completion Functions).
This function inserts the completion text directly into the current
buffer. Unlike completing-read (see section Completion and the Minibuffer), it does not activate the minibuffer.
For this function to work, point must be somewhere between start and end.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes functions used to ask the user a yes-or-no
question. The function y-or-n-p can be answered with a single
character; it is useful for questions where an inadvertent wrong answer
will not have serious consequences. yes-or-no-p is suitable for
more momentous questions, since it requires three or four characters to
answer.
If either of these functions is called in a command that was invoked
using the mouse—more precisely, if last-nonmenu-event
(see section Information from the Command Loop) is either nil or a list—then it
uses a dialog box or pop-up menu to ask the question. Otherwise, it
uses keyboard input. You can force use either of the mouse or of keyboard
input by binding last-nonmenu-event to a suitable value around
the call.
Strictly speaking, yes-or-no-p uses the minibuffer and
y-or-n-p does not; but it seems best to describe them together.
This function asks the user a question, expecting input in the echo
area. It returns t if the user types y, nil if the
user types n. This function also accepts SPC to mean yes
and DEL to mean no. It accepts C-] to mean “quit”, like
C-g, because the question might look like a minibuffer and for
that reason the user might try to use C-] to get out. The answer
is a single character, with no RET needed to terminate it. Upper
and lower case are equivalent.
“Asking the question” means printing prompt in the echo area, followed by the string ‘(y or n) ’. If the input is not one of the expected answers (y, n, SPC, DEL, or something that quits), the function responds ‘Please answer y or n.’, and repeats the request.
This function does not actually use the minibuffer, since it does not allow editing of the answer. It actually uses the echo area (see section The Echo Area), which uses the same screen space as the minibuffer. The cursor moves to the echo area while the question is being asked.
The answers and their meanings, even ‘y’ and ‘n’, are not
hardwired, and are specified by the keymap query-replace-map
(see section Search and Replace). In particular, if the user enters the
special responses recenter, scroll-up,
scroll-down, scroll-other-window, or
scroll-other-window-down (respectively bound to C-l,
C-v, M-v, C-M-v and C-M-S-v in
query-replace-map), this function performs the specified window
recentering or scrolling operation, and poses the question again.
We show successive lines of echo area messages, but only one actually appears on the screen at a time.
Like y-or-n-p, except that if the user fails to answer within
seconds seconds, this function stops waiting and returns
default. It works by setting up a timer; see Timers for Delayed Execution.
The argument seconds should be a number.
This function asks the user a question, expecting input in the
minibuffer. It returns t if the user enters ‘yes’,
nil if the user types ‘no’. The user must type RET to
finalize the response. Upper and lower case are equivalent.
yes-or-no-p starts by displaying prompt in the echo area,
followed by ‘(yes or no) ’. The user must type one of the
expected responses; otherwise, the function responds ‘Please answer
yes or no.’, waits about two seconds and repeats the request.
yes-or-no-p requires more work from the user than
y-or-n-p and is appropriate for more crucial decisions.
Here is an example:
(yes-or-no-p "Do you really want to remove everything? ") ;; After evaluation of the preceding expression, ;; the following prompt appears, ;; with an empty minibuffer:
---------- Buffer: minibuffer ---------- Do you really want to remove everything? (yes or no) ---------- Buffer: minibuffer ----------
If the user first types y RET, which is invalid because this function demands the entire word ‘yes’, it responds by displaying these prompts, with a brief pause between them:
---------- Buffer: minibuffer ---------- Please answer yes or no. Do you really want to remove everything? (yes or no) ---------- Buffer: minibuffer ----------
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When you have a series of similar questions to ask, such as “Do you
want to save this buffer” for each buffer in turn, you should use
map-y-or-n-p to ask the collection of questions, rather than
asking each question individually. This gives the user certain
convenient facilities such as the ability to answer the whole series at
once.
This function asks the user a series of questions, reading a single-character answer in the echo area for each one.
The value of list specifies the objects to ask questions about.
It should be either a list of objects or a generator function. If it is
a function, it should expect no arguments, and should return either the
next object to ask about, or nil, meaning to stop asking questions.
The argument prompter specifies how to ask each question. If prompter is a string, the question text is computed like this:
(format prompter object)
where object is the next object to ask about (as obtained from list).
If not a string, prompter should be a function of one argument
(the next object to ask about) and should return the question text. If
the value is a string, that is the question to ask the user. The
function can also return t, meaning do act on this object (and
don’t ask the user), or nil, meaning ignore this object (and don’t
ask the user).
The argument actor says how to act on the answers that the user gives. It should be a function of one argument, and it is called with each object that the user says yes for. Its argument is always an object obtained from list.
If the argument help is given, it should be a list of this form:
(singular plural action)
where singular is a string containing a singular noun that describes the objects conceptually being acted on, plural is the corresponding plural noun, and action is a transitive verb describing what actor does.
If you don’t specify help, the default is ("object"
"objects" "act on").
Each time a question is asked, the user may enter y, Y, or
SPC to act on that object; n, N, or DEL to skip
that object; ! to act on all following objects; ESC or
q to exit (skip all following objects); . (period) to act on
the current object and then exit; or C-h to get help. These are
the same answers that query-replace accepts. The keymap
query-replace-map defines their meaning for map-y-or-n-p
as well as for query-replace; see Search and Replace.
You can use action-alist to specify additional possible answers
and what they mean. It is an alist of elements of the form
(char function help), each of which defines one
additional answer. In this element, char is a character (the
answer); function is a function of one argument (an object from
list); help is a string.
When the user responds with char, map-y-or-n-p calls
function. If it returns non-nil, the object is considered
“acted upon”, and map-y-or-n-p advances to the next object in
list. If it returns nil, the prompt is repeated for the
same object.
Normally, map-y-or-n-p binds cursor-in-echo-area while
prompting. But if no-cursor-in-echo-area is non-nil, it
does not do that.
If map-y-or-n-p is called in a command that was invoked using the
mouse—more precisely, if last-nonmenu-event (see section Information from the Command Loop) is either nil or a list—then it uses a dialog box
or pop-up menu to ask the question. In this case, it does not use
keyboard input or the echo area. You can force use either of the mouse or
of keyboard input by binding last-nonmenu-event to a suitable
value around the call.
The return value of map-y-or-n-p is the number of objects acted on.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To read a password to pass to another program, you can use the
function read-passwd.
This function reads a password, prompting with prompt. It does not echo the password as the user types it; instead, it echoes ‘.’ for each character in the password. (Note that in batch mode, the input is not hidden.)
The optional argument confirm, if non-nil, says to read the
password twice and insist it must be the same both times. If it isn’t
the same, the user has to type it over and over until the last two
times match.
The optional argument default specifies the default password to
return if the user enters empty input. If default is nil,
then read-passwd returns the null string in that case.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes some commands meant for use in the minibuffer.
This command exits the active minibuffer. It is normally bound to keys in minibuffer local keymaps.
This command exits the active minibuffer after inserting the last
character typed on the keyboard (found in last-command-event;
see section Information from the Command Loop).
This command replaces the minibuffer contents with the value of the nth previous (older) history element.
This command replaces the minibuffer contents with the value of the nth more recent history element.
This command replaces the minibuffer contents with the value of the nth previous (older) history element that matches pattern (a regular expression).
This command replaces the minibuffer contents with the value of the nth next (newer) history element that matches pattern (a regular expression).
This command replaces the minibuffer contents with the value of the nth previous (older) history element that completes the current contents of the minibuffer before the point.
This command replaces the minibuffer contents with the value of the nth next (newer) history element that completes the current contents of the minibuffer before the point.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These functions access and select minibuffer windows and test whether they are active.
This function returns the currently active minibuffer window, or
nil if there is none.
This function returns the minibuffer window used for frame frame.
If frame is nil, that stands for the current frame. Note
that the minibuffer window used by a frame need not be part of that
frame—a frame that has no minibuffer of its own necessarily uses some
other frame’s minibuffer window.
This function specifies window as the minibuffer window to use. This affects where the minibuffer is displayed if you put text in it without invoking the usual minibuffer commands. It has no effect on the usual minibuffer input functions because they all start by choosing the minibuffer window according to the current frame.
This function returns non-nil if window is a minibuffer
window.
window defaults to the selected window.
It is not correct to determine whether a given window is a minibuffer by
comparing it with the result of (minibuffer-window), because
there can be more than one minibuffer window if there is more than one
frame.
This function returns non-nil if window is the currently
active minibuffer window.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These functions access the minibuffer prompt and contents.
This function returns the prompt string of the currently active
minibuffer. If no minibuffer is active, it returns nil.
This function returns the current position of the end of the minibuffer prompt, if a minibuffer is current. Otherwise, it returns the minimum valid buffer position.
This function returns the current display-width of the minibuffer prompt, if a minibuffer is current. Otherwise, it returns zero.
This function returns the editable contents of the minibuffer (that is, everything except the prompt) as a string, if a minibuffer is current. Otherwise, it returns the entire contents of the current buffer.
This is like minibuffer-contents, except that it does not copy text
properties, just the characters themselves. See section Text Properties.
This function erases the editable contents of the minibuffer (that is, everything except the prompt), if a minibuffer is current. Otherwise, it erases the entire current buffer.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These functions and variables deal with recursive minibuffers (see section Recursive Editing):
This function returns the current depth of activations of the minibuffer, a nonnegative integer. If no minibuffers are active, it returns zero.
If this variable is non-nil, you can invoke commands (such as
find-file) that use minibuffers even while the minibuffer window
is active. Such invocation produces a recursive editing level for a new
minibuffer. The outer-level minibuffer is invisible while you are
editing the inner one.
If this variable is nil, you cannot invoke minibuffer
commands when the minibuffer window is active, not even if you switch to
another window to do it.
If a command name has a property enable-recursive-minibuffers
that is non-nil, then the command can use the minibuffer to read
arguments even if it is invoked from the minibuffer. A command can
also achieve this by binding enable-recursive-minibuffers
to t in the interactive declaration (see section Using interactive).
The minibuffer command next-matching-history-element (normally
M-s in the minibuffer) does the latter.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This function returns non-nil if buffer-or-name is a
minibuffer. If buffer-or-name is omitted, it tests the current
buffer.
This is a normal hook that is run whenever the minibuffer is entered. See section Hooks.
This is a normal hook that is run whenever the minibuffer is exited. See section Hooks.
The current value of this variable is used to rebind help-form
locally inside the minibuffer (see section Help Functions).
If the value of this variable is non-nil, it should be a window
object. When the function scroll-other-window is called in the
minibuffer, it scrolls this window.
This function returns the window that was selected when the
minibuffer was entered. If selected window is not a minibuffer
window, it returns nil.
This variable specifies the maximum height for resizing minibuffer windows. If a float, it specifies a fraction of the height of the frame. If an integer, it specifies a number of lines.
This function displays string temporarily at the end of the
minibuffer text, for a few seconds, or until the next input event
arrives, whichever comes first. The variable
minibuffer-message-timeout specifies the number of seconds to
wait in the absence of input. It defaults to 2. If args is
non-nil, the actual message is obtained by passing string
and args through format. See section Formatting Strings.
This is the major mode used in inactive minibuffers. It uses
keymap minibuffer-inactive-mode-map. This can be useful
if the minibuffer is in a separate frame. See section Minibuffers and Frames.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When you run Emacs, it enters the editor command loop almost immediately. This loop reads key sequences, executes their definitions, and displays the results. In this chapter, we describe how these things are done, and the subroutines that allow Lisp programs to do them.
| 20.1 Command Loop Overview | How the command loop reads commands. | |
| 20.2 Defining Commands | Specifying how a function should read arguments. | |
| 20.3 Interactive Call | Calling a command, so that it will read arguments. | |
| 20.4 Distinguish Interactive Calls | Making a command distinguish interactive calls. | |
| 20.5 Information from the Command Loop | Variables set by the command loop for you to examine. | |
| 20.6 Adjusting Point After Commands | Adjustment of point after a command. | |
| 20.7 Input Events | What input looks like when you read it. | |
| 20.8 Reading Input | How to read input events from the keyboard or mouse. | |
| 20.9 Special Events | Events processed immediately and individually. | |
| 20.10 Waiting for Elapsed Time or Input | Waiting for user input or elapsed time. | |
| 20.11 Quitting | How C-g works. How to catch or defer quitting. | |
| 20.12 Prefix Command Arguments | How the commands to set prefix args work. | |
| 20.13 Recursive Editing | Entering a recursive edit, and why you usually shouldn’t. | |
| 20.14 Disabling Commands | How the command loop handles disabled commands. | |
| 20.15 Command History | How the command history is set up, and how accessed. | |
| 20.16 Keyboard Macros | How keyboard macros are implemented. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The first thing the command loop must do is read a key sequence,
which is a sequence of input events that translates into a command.
It does this by calling the function read-key-sequence. Lisp
programs can also call this function (see section Key Sequence Input).
They can also read input at a lower level with read-key or
read-event (see section Reading One Event), or discard pending
input with discard-input (see section Miscellaneous Event Input Features).
The key sequence is translated into a command through the currently
active keymaps. See section Key Lookup, for information on how this is done.
The result should be a keyboard macro or an interactively callable
function. If the key is M-x, then it reads the name of another
command, which it then calls. This is done by the command
execute-extended-command (see section Interactive Call).
Prior to executing the command, Emacs runs undo-boundary to
create an undo boundary. See section Maintaining Undo Lists.
To execute a command, Emacs first reads its arguments by calling
command-execute (see section Interactive Call). For commands
written in Lisp, the interactive specification says how to read
the arguments. This may use the prefix argument (see section Prefix Command Arguments) or may read with prompting in the minibuffer
(see section Minibuffers). For example, the command find-file has
an interactive specification which says to read a file name
using the minibuffer. The function body of find-file does not
use the minibuffer, so if you call find-file as a function from
Lisp code, you must supply the file name string as an ordinary Lisp
function argument.
If the command is a keyboard macro (i.e., a string or vector),
Emacs executes it using execute-kbd-macro (see section Keyboard Macros).
This normal hook is run by the editor command loop before it executes
each command. At that time, this-command contains the command
that is about to run, and last-command describes the previous
command. See section Information from the Command Loop.
This normal hook is run by the editor command loop after it executes
each command (including commands terminated prematurely by quitting or
by errors). At that time, this-command refers to the command
that just ran, and last-command refers to the command before
that.
This hook is also run when Emacs first enters the command loop (at
which point this-command and last-command are both
nil).
Quitting is suppressed while running pre-command-hook and
post-command-hook. If an error happens while executing one of
these hooks, it does not terminate execution of the hook; instead
the error is silenced and the function in which the error occurred
is removed from the hook.
A request coming into the Emacs server (see Emacs Server in The GNU Emacs Manual) runs these two hooks just as a keyboard command does.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The special form interactive turns a Lisp function into a
command. The interactive form must be located at top-level in
the function body, usually as the first form in the body; this applies
to both lambda expressions (see section Lambda Expressions) and
defun forms (see section Defining Functions). This form does
nothing during the actual execution of the function; its presence
serves as a flag, telling the Emacs command loop that the function can
be called interactively. The argument of the interactive form
specifies how the arguments for an interactive call should be read.
Alternatively, an interactive form may be specified in a
function symbol’s interactive-form property. A non-nil
value for this property takes precedence over any interactive
form in the function body itself. This feature is seldom used.
Sometimes, a function is only intended to be called interactively,
never directly from Lisp. In that case, give the function a
non-nil interactive-only property. This causes the
byte compiler to warn if the command is called from Lisp. The value
of the property can be: a string, which the byte-compiler will
use directly in its warning (it should end with a period,
and not start with a capital, e.g. “use … instead.”); t;
any other symbol, which should be an alternative function to use in
Lisp code.
20.2.1 Using interactive | General rules for interactive.
| |
20.2.2 Code Characters for interactive | The standard letter-codes for reading arguments in various ways. | |
20.2.3 Examples of Using interactive | Examples of how to read interactive arguments. | |
| 20.2.4 Select among Command Alternatives | Select among command alternatives. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
interactiveThis section describes how to write the interactive form that
makes a Lisp function an interactively-callable command, and how to
examine a command’s interactive form.
This special form declares that a function is a command, and that it may therefore be called interactively (via M-x or by entering a key sequence bound to it). The argument arg-descriptor declares how to compute the arguments to the command when the command is called interactively.
A command may be called from Lisp programs like any other function, but then the caller supplies the arguments and arg-descriptor has no effect.
The interactive form must be located at top-level in the
function body, or in the function symbol’s interactive-form
property (see section Symbol Properties). It has its effect because the
command loop looks for it before calling the function
(see section Interactive Call). Once the function is called, all its body
forms are executed; at this time, if the interactive form
occurs within the body, the form simply returns nil without
even evaluating its argument.
By convention, you should put the interactive form in the
function body, as the first top-level form. If there is an
interactive form in both the interactive-form symbol
property and the function body, the former takes precedence. The
interactive-form symbol property can be used to add an
interactive form to an existing function, or change how its arguments
are processed interactively, without redefining the function.
There are three possibilities for the argument arg-descriptor:
nil; then the command is called with no
arguments. This leads quickly to an error if the command requires one
or more arguments.
interactive) optionally followed by a prompt (which
some code characters use and some ignore). Here is an example:
(interactive "P\nbFrobnicate buffer: ")
The code letter ‘P’ sets the command’s first argument to the raw command prefix (see section Prefix Command Arguments). ‘bFrobnicate buffer: ’ prompts the user with ‘Frobnicate buffer: ’ to enter the name of an existing buffer, which becomes the second and final argument.
The prompt string can use ‘%’ to include previous argument values
(starting with the first argument) in the prompt. This is done using
format (see section Formatting Strings). For example, here is how
you could read the name of an existing buffer followed by a new name to
give to that buffer:
(interactive "bBuffer to rename: \nsRename buffer %s to: ")
If ‘*’ appears at the beginning of the string, then an error is signaled if the buffer is read-only.
If ‘@’ appears at the beginning of the string, and if the key sequence used to invoke the command includes any mouse events, then the window associated with the first of those events is selected before the command is run.
If ‘^’ appears at the beginning of the string, and if the command
was invoked through shift-translation, set the mark and activate
the region temporarily, or extend an already active region, before the
command is run. If the command was invoked without shift-translation,
and the region is temporarily active, deactivate the region before the
command is run. Shift-translation is controlled on the user level by
shift-select-mode; see Shift Selection in The GNU
Emacs Manual.
You can use ‘*’, ‘@’, and ^ together; the order does
not matter. Actual reading of arguments is controlled by the rest of
the prompt string (starting with the first character that is not
‘*’, ‘@’, or ‘^’).
Providing point or the mark as an argument value is also common, but if you do this and read input (whether using the minibuffer or not), be sure to get the integer values of point or the mark after reading. The current buffer may be receiving subprocess output; if subprocess output arrives while the command is waiting for input, it could relocate point and the mark.
Here’s an example of what not to do:
(interactive
(list (region-beginning) (region-end)
(read-string "Foo: " nil 'my-history)))
Here’s how to avoid the problem, by examining point and the mark after reading the keyboard input:
(interactive (let ((string (read-string "Foo: " nil 'my-history))) (list (region-beginning) (region-end) string)))
Warning: the argument values should not include any data
types that can’t be printed and then read. Some facilities save
command-history in a file to be read in the subsequent
sessions; if a command’s arguments contain a data type that prints
using ‘#<…>’ syntax, those facilities won’t work.
There are, however, a few exceptions: it is ok to use a limited set of
expressions such as (point), (mark),
(region-beginning), and (region-end), because Emacs
recognizes them specially and puts the expression (rather than its
value) into the command history. To see whether the expression you
wrote is one of these exceptions, run the command, then examine
(car command-history).
This function returns the interactive form of function.
If function is an interactively callable function
(see section Interactive Call), the value is the command’s
interactive form (interactive spec), which
specifies how to compute its arguments. Otherwise, the value is
nil. If function is a symbol, its function definition is
used.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
interactiveThe code character descriptions below contain a number of key words, defined here as follows:
Provide completion. TAB, SPC, and RET perform name
completion because the argument is read using completing-read
(see section Completion). ? displays a list of possible completions.
Require the name of an existing object. An invalid name is not accepted; the commands to exit the minibuffer do not exit if the current input is not valid.
A default value of some sort is used if the user enters no text in the minibuffer. The default depends on the code character.
This code letter computes an argument without reading any input. Therefore, it does not use a prompt string, and any prompt string you supply is ignored.
Even though the code letter doesn’t use a prompt string, you must follow it with a newline if it is not the last code character in the string.
A prompt immediately follows the code character. The prompt ends either with the end of the string or with a newline.
This code character is meaningful only at the beginning of the interactive string, and it does not look for a prompt or a newline. It is a single, isolated character.
Here are the code character descriptions for use with interactive:
Signal an error if the current buffer is read-only. Special.
Select the window mentioned in the first mouse event in the key sequence that invoked this command. Special.
If the command was invoked through shift-translation, set the mark and activate the region temporarily, or extend an already active region, before the command is run. If the command was invoked without shift-translation, and the region is temporarily active, deactivate the region before the command is run. Special.
A function name (i.e., a symbol satisfying fboundp). Existing,
Completion, Prompt.
The name of an existing buffer. By default, uses the name of the current buffer (see section Buffers). Existing, Completion, Default, Prompt.
A buffer name. The buffer need not exist. By default, uses the name of a recently used buffer other than the current buffer. Completion, Default, Prompt.
A character. The cursor does not move into the echo area. Prompt.
A command name (i.e., a symbol satisfying commandp). Existing,
Completion, Prompt.
The position of point, as an integer (see section Point). No I/O.
A directory name. The default is the current default directory of the
current buffer, default-directory (see section Functions that Expand Filenames).
Existing, Completion, Default, Prompt.
The first or next non-keyboard event in the key sequence that invoked the command. More precisely, ‘e’ gets events that are lists, so you can look at the data in the lists. See section Input Events. No I/O.
You use ‘e’ for mouse events and for special system events (see section Miscellaneous System Events). The event list that the command receives depends on the event. See section Input Events, which describes the forms of the list for each event in the corresponding subsections.
You can use ‘e’ more than once in a single command’s interactive specification. If the key sequence that invoked the command has n events that are lists, the nth ‘e’ provides the nth such event. Events that are not lists, such as function keys and ASCII characters, do not count where ‘e’ is concerned.
A file name of an existing file (see section File Names). The default
directory is default-directory. Existing, Completion, Default,
Prompt.
A file name. The file need not exist. Completion, Default, Prompt.
A file name. The file need not exist. If the user enters just a directory name, then the value is just that directory name, with no file name within the directory added. Completion, Default, Prompt.
An irrelevant argument. This code always supplies nil as
the argument’s value. No I/O.
A key sequence (see section Key Sequences). This keeps reading events until a command (or undefined command) is found in the current key maps. The key sequence argument is represented as a string or vector. The cursor does not move into the echo area. Prompt.
If ‘k’ reads a key sequence that ends with a down-event, it also reads and discards the following up-event. You can get access to that up-event with the ‘U’ code character.
This kind of input is used by commands such as describe-key and
global-set-key.
A key sequence, whose definition you intend to change. This works like ‘k’, except that it suppresses, for the last input event in the key sequence, the conversions that are normally used (when necessary) to convert an undefined key into a defined one.
The position of the mark, as an integer. No I/O.
Arbitrary text, read in the minibuffer using the current buffer’s input method, and returned as a string (see Input Methods in The GNU Emacs Manual). Prompt.
A number, read with the minibuffer. If the input is not a number, the user has to try again. ‘n’ never uses the prefix argument. Prompt.
The numeric prefix argument; but if there is no prefix argument, read a number as with n. The value is always a number. See section Prefix Command Arguments. Prompt.
The numeric prefix argument. (Note that this ‘p’ is lower case.) No I/O.
The raw prefix argument. (Note that this ‘P’ is upper case.) No I/O.
Point and the mark, as two numeric arguments, smallest first. This is the only code letter that specifies two successive arguments rather than one. No I/O.
Arbitrary text, read in the minibuffer and returned as a string (see section Reading Text Strings with the Minibuffer). Terminate the input with either C-j or RET. (C-q may be used to include either of these characters in the input.) Prompt.
An interned symbol whose name is read in the minibuffer. Terminate the input with either C-j or RET. Other characters that normally terminate a symbol (e.g., whitespace, parentheses and brackets) do not do so here. Prompt.
A key sequence or nil. Can be used after a ‘k’ or
‘K’ argument to get the up-event that was discarded (if any)
after ‘k’ or ‘K’ read a down-event. If no up-event has been
discarded, ‘U’ provides nil as the argument. No I/O.
A variable declared to be a user option (i.e., satisfying the
predicate custom-variable-p). This reads the variable using
read-variable. See Definition of read-variable. Existing,
Completion, Prompt.
A Lisp object, specified with its read syntax, terminated with a C-j or RET. The object is not evaluated. See section Reading Lisp Objects with the Minibuffer. Prompt.
A Lisp form’s value. ‘X’ reads as ‘x’ does, then evaluates the form so that its value becomes the argument for the command. Prompt.
A coding system name (a symbol). If the user enters null input, the
argument value is nil. See section Coding Systems. Completion,
Existing, Prompt.
A coding system name (a symbol)—but only if this command has a prefix
argument. With no prefix argument, ‘Z’ provides nil as the
argument value. Completion, Existing, Prompt.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
interactiveHere are some examples of interactive:
(defun foo1 () ; foo1 takes no arguments,
(interactive) ; just moves forward two words.
(forward-word 2))
⇒ foo1
(defun foo2 (n) ;foo2takes one argument, (interactive "^p") ; which is the numeric prefix. ; undershift-select-mode, ; will activate or extend region. (forward-word (* 2 n))) ⇒ foo2
(defun foo3 (n) ; foo3 takes one argument,
(interactive "nCount:") ; which is read with the Minibuffer.
(forward-word (* 2 n)))
⇒ foo3
(defun three-b (b1 b2 b3) "Select three existing buffers. Put them into three windows, selecting the last one."
(interactive "bBuffer1:\nbBuffer2:\nbBuffer3:")
(delete-other-windows)
(split-window (selected-window) 8)
(switch-to-buffer b1)
(other-window 1)
(split-window (selected-window) 8)
(switch-to-buffer b2)
(other-window 1)
(switch-to-buffer b3))
⇒ three-b
(three-b "*scratch*" "declarations.texi" "*mail*")
⇒ nil
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The macro define-alternatives can be used to define
generic commands. These are interactive functions whose
implementation can be selected from several alternatives, as a matter
of user preference.
Define the new command command, a symbol.
When a user runs M-x command RET for the first time, Emacs prompts for which real form of the command to use, and records the selection by way of a custom variable. Using a prefix argument repeats this process of choosing an alternative.
The variable command-alternatives should contain an alist
with alternative implementations of command.
Until this variable is set, define-alternatives has no effect.
If customizations is non-nil, it should consist of
alternating defcustom keywords (typically :group and
:version) and values to add to the declaration of
command-alternatives.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
After the command loop has translated a key sequence into a command,
it invokes that command using the function command-execute. If
the command is a function, command-execute calls
call-interactively, which reads the arguments and calls the
command. You can also call these functions yourself.
Note that the term “command”, in this context, refers to an interactively callable function (or function-like object), or a keyboard macro. It does not refer to the key sequence used to invoke a command (see section Keymaps).
This function returns t if object is a command.
Otherwise, it returns nil.
Commands include strings and vectors (which are treated as keyboard
macros), lambda expressions that contain a top-level
interactive form (see section Using interactive), byte-code
function objects made from such lambda expressions, autoload objects
that are declared as interactive (non-nil fourth argument to
autoload), and some primitive functions. Also, a symbol is
considered a command if it has a non-nil
interactive-form property, or if its function definition
satisfies commandp.
If for-call-interactively is non-nil, then
commandp returns t only for objects that
call-interactively could call—thus, not for keyboard macros.
See documentation in Access to Documentation Strings, for a
realistic example of using commandp.
This function calls the interactively callable function command, providing arguments according to its interactive calling specifications. It returns whatever command returns.
If, for instance, you have a function with the following signature:
(defun foo (begin end) (interactive "r") ...)
then saying
(call-interactively 'foo)
will call foo with the region (point and mark) as
the arguments.
An error is signaled if command is not a function or if it
cannot be called interactively (i.e., is not a command). Note that
keyboard macros (strings and vectors) are not accepted, even though
they are considered commands, because they are not functions. If
command is a symbol, then call-interactively uses its
function definition.
If record-flag is non-nil, then this command and its
arguments are unconditionally added to the list command-history.
Otherwise, the command is added only if it uses the minibuffer to read
an argument. See section Command History.
The argument keys, if given, should be a vector which specifies
the sequence of events to supply if the command inquires which events
were used to invoke it. If keys is omitted or nil, the
default is the return value of this-command-keys-vector.
See Definition of this-command-keys-vector.
This function executes command. The argument command must
satisfy the commandp predicate; i.e., it must be an interactively
callable function or a keyboard macro.
A string or vector as command is executed with
execute-kbd-macro. A function is passed to
call-interactively (see above), along with the
record-flag and keys arguments.
If command is a symbol, its function definition is used in its
place. A symbol with an autoload definition counts as a
command if it was declared to stand for an interactively callable
function. Such a definition is handled by loading the specified
library and then rechecking the definition of the symbol.
The argument special, if given, means to ignore the prefix argument and not clear it. This is used for executing special events (see section Special Events).
This function reads a command name from the minibuffer using
completing-read (see section Completion). Then it uses
command-execute to call the specified command. Whatever that
command returns becomes the value of execute-extended-command.
If the command asks for a prefix argument, it receives the value
prefix-argument. If execute-extended-command is called
interactively, the current raw prefix argument is used for
prefix-argument, and thus passed on to whatever command is run.
execute-extended-command is the normal definition of M-x,
so it uses the string ‘M-x ’ as a prompt. (It would be better
to take the prompt from the events used to invoke
execute-extended-command, but that is painful to implement.) A
description of the value of the prefix argument, if any, also becomes
part of the prompt.
(execute-extended-command 3)
---------- Buffer: Minibuffer ----------
3 M-x forward-word RET
---------- Buffer: Minibuffer ----------
⇒ t
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Sometimes a command should display additional visual feedback (such
as an informative message in the echo area) for interactive calls
only. There are three ways to do this. The recommended way to test
whether the function was called using call-interactively is to
give it an optional argument print-message and use the
interactive spec to make it non-nil in interactive
calls. Here’s an example:
(defun foo (&optional print-message)
(interactive "p")
(when print-message
(message "foo")))
We use "p" because the numeric prefix argument is never
nil. Defined in this way, the function does display the
message when called from a keyboard macro.
The above method with the additional argument is usually best,
because it allows callers to say “treat this call as interactive”.
But you can also do the job by testing called-interactively-p.
This function returns t when the calling function was called
using call-interactively.
The argument kind should be either the symbol interactive
or the symbol any. If it is interactive, then
called-interactively-p returns t only if the call was
made directly by the user—e.g., if the user typed a key sequence
bound to the calling function, but not if the user ran a
keyboard macro that called the function (see section Keyboard Macros). If
kind is any, called-interactively-p returns
t for any kind of interactive call, including keyboard macros.
If in doubt, use any; the only known proper use of
interactive is if you need to decide whether to display a
helpful message while a function is running.
A function is never considered to be called interactively if it was
called via Lisp evaluation (or with apply or funcall).
Here is an example of using called-interactively-p:
(defun foo ()
(interactive)
(when (called-interactively-p 'any)
(message "Interactive!")
'foo-called-interactively))
;; Type M-x foo.
-| Interactive!
(foo)
⇒ nil
Here is another example that contrasts direct and indirect calls to
called-interactively-p.
(defun bar () (interactive) (message "%s" (list (foo) (called-interactively-p 'any))))
;; Type M-x bar.
-| (nil t)
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The editor command loop sets several Lisp variables to keep status
records for itself and for commands that are run. With the exception of
this-command and last-command it’s generally a bad idea to
change any of these variables in a Lisp program.
This variable records the name of the previous command executed by the command loop (the one before the current command). Normally the value is a symbol with a function definition, but this is not guaranteed.
The value is copied from this-command when a command returns to
the command loop, except when the command has specified a prefix
argument for the following command.
This variable is always local to the current terminal and cannot be buffer-local. See section Multiple Terminals.
This variable is set up by Emacs just like last-command,
but never altered by Lisp programs.
This variable stores the most recently executed command that was not
part of an input event. This is the command repeat will try to
repeat, See Repeating in The GNU Emacs Manual.
This variable records the name of the command now being executed by
the editor command loop. Like last-command, it is normally a symbol
with a function definition.
The command loop sets this variable just before running a command, and
copies its value into last-command when the command finishes
(unless the command specified a prefix argument for the following
command).
Some commands set this variable during their execution, as a flag for
whatever command runs next. In particular, the functions for killing text
set this-command to kill-region so that any kill commands
immediately following will know to append the killed text to the
previous kill.
If you do not want a particular command to be recognized as the previous
command in the case where it got an error, you must code that command to
prevent this. One way is to set this-command to t at the
beginning of the command, and set this-command back to its proper
value at the end, like this:
(defun foo (args…)
(interactive …)
(let ((old-this-command this-command))
(setq this-command t)
…do the work…
(setq this-command old-this-command)))
We do not bind this-command with let because that would
restore the old value in case of error—a feature of let which
in this case does precisely what we want to avoid.
This has the same value as this-command except when command
remapping occurs (see section Remapping Commands). In that case,
this-command gives the command actually run (the result of
remapping), and this-original-command gives the command that
was specified to run but remapped into another command.
This function returns a string or vector containing the key sequence
that invoked the present command, plus any previous commands that
generated the prefix argument for this command. Any events read by the
command using read-event without a timeout get tacked on to the end.
However, if the command has called read-key-sequence, it
returns the last read key sequence. See section Key Sequence Input. The
value is a string if all events in the sequence were characters that
fit in a string. See section Input Events.
(this-command-keys)
;; Now use C-u C-x C-e to evaluate that.
⇒ "^U^X^E"
Like this-command-keys, except that it always returns the events
in a vector, so you don’t need to deal with the complexities of storing
input events in a string (see section Putting Keyboard Events in Strings).
This function empties out the table of events for
this-command-keys to return. Unless keep-record is
non-nil, it also empties the records that the function
recent-keys (see section Recording Input) will subsequently return.
This is useful after reading a password, to prevent the password from
echoing inadvertently as part of the next command in certain cases.
This variable holds the last input event read as part of a key sequence, not counting events resulting from mouse menus.
One use of this variable is for telling x-popup-menu where to pop
up a menu. It is also used internally by y-or-n-p
(see section Yes-or-No Queries).
This variable is set to the last input event that was read by the
command loop as part of a command. The principal use of this variable
is in self-insert-command, which uses it to decide which
character to insert.
last-command-event
;; Now use C-u C-x C-e to evaluate that.
⇒ 5
The value is 5 because that is the ASCII code for C-e.
This variable records which frame the last input event was directed to. Usually this is the frame that was selected when the event was generated, but if that frame has redirected input focus to another frame, the value is the frame to which the event was redirected. See section Input Focus.
If the last event came from a keyboard macro, the value is macro.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
It is not easy to display a value of point in the middle of a
sequence of text that has the display, composition or
is invisible. Therefore, after a command finishes and returns to the
command loop, if point is within such a sequence, the command loop
normally moves point to the edge of the sequence.
A command can inhibit this feature by setting the variable
disable-point-adjustment:
If this variable is non-nil when a command returns to the
command loop, then the command loop does not check for those text
properties, and does not move point out of sequences that have them.
The command loop sets this variable to nil before each command,
so if a command sets it, the effect applies only to that command.
If you set this variable to a non-nil value, the feature of
moving point out of these sequences is completely turned off.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The Emacs command loop reads a sequence of input events that represent keyboard or mouse activity, or system events sent to Emacs. The events for keyboard activity are characters or symbols; other events are always lists. This section describes the representation and meaning of input events in detail.
This function returns non-nil if object is an input event
or event type.
Note that any symbol might be used as an event or an event type.
eventp cannot distinguish whether a symbol is intended by Lisp
code to be used as an event. Instead, it distinguishes whether the
symbol has actually been used in an event that has been read as input in
the current Emacs session. If a symbol has not yet been so used,
eventp returns nil.
| 20.7.1 Keyboard Events | Ordinary characters–keys with symbols on them. | |
| 20.7.2 Function Keys | Function keys–keys with names, not symbols. | |
| 20.7.3 Mouse Events | Overview of mouse events. | |
| 20.7.4 Click Events | Pushing and releasing a mouse button. | |
| 20.7.5 Drag Events | Moving the mouse before releasing the button. | |
| 20.7.6 Button-Down Events | A button was pushed and not yet released. | |
| 20.7.7 Repeat Events | Double and triple click (or drag, or down). | |
| 20.7.8 Motion Events | Just moving the mouse, not pushing a button. | |
| 20.7.9 Focus Events | Moving the mouse between frames. | |
| 20.7.10 Miscellaneous System Events | Other events the system can generate. | |
| 20.7.11 Event Examples | Examples of the lists for mouse events. | |
| 20.7.12 Classifying Events | Finding the modifier keys in an event symbol. Event types. | |
| 20.7.13 Accessing Mouse Events | Functions to extract info from mouse events. | |
| 20.7.14 Accessing Scroll Bar Events | Functions to get info from scroll bar events. | |
| 20.7.15 Putting Keyboard Events in Strings | Special considerations for putting keyboard character events in a string. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
There are two kinds of input you can get from the keyboard: ordinary keys, and function keys. Ordinary keys correspond to characters; the events they generate are represented in Lisp as characters. The event type of a character event is the character itself (an integer); see Classifying Events.
An input character event consists of a basic code between 0 and 524287, plus any or all of these modifier bits:
The 2**27 bit in the character code indicates a character typed with the meta key held down.
The 2**26 bit in the character code indicates a non-ASCII control character.
ASCII control characters such as C-a have special basic codes of their own, so Emacs needs no special bit to indicate them. Thus, the code for C-a is just 1.
But if you type a control combination not in ASCII, such as % with the control key, the numeric value you get is the code for % plus 2**26 (assuming the terminal supports non-ASCII control characters).
The 2**25 bit in the character code indicates an ASCII control character typed with the shift key held down.
For letters, the basic code itself indicates upper versus lower case; for digits and punctuation, the shift key selects an entirely different character with a different basic code. In order to keep within the ASCII character set whenever possible, Emacs avoids using the 2**25 bit for those characters.
However, ASCII provides no way to distinguish C-A from C-a, so Emacs uses the 2**25 bit in C-A and not in C-a.
The 2**24 bit in the character code indicates a character typed with the hyper key held down.
The 2**23 bit in the character code indicates a character typed with the super key held down.
The 2**22 bit in the character code indicates a character typed with the alt key held down. (The key labeled Alt on most keyboards is actually treated as the meta key, not this.)
It is best to avoid mentioning specific bit numbers in your program.
To test the modifier bits of a character, use the function
event-modifiers (see section Classifying Events). When making key
bindings, you can use the read syntax for characters with modifier bits
(‘\C-’, ‘\M-’, and so on). For making key bindings with
define-key, you can use lists such as (control hyper ?x) to
specify the characters (see section Changing Key Bindings). The function
event-convert-list converts such a list into an event type
(see section Classifying Events).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Most keyboards also have function keys—keys that have names or
symbols that are not characters. Function keys are represented in
Emacs Lisp as symbols; the symbol’s name is the function key’s label,
in lower case. For example, pressing a key labeled F1 generates
an input event represented by the symbol f1.
The event type of a function key event is the event symbol itself. See section Classifying Events.
Here are a few special cases in the symbol-naming convention for function keys:
backspace, tab, newline, return, deleteThese keys correspond to common ASCII control characters that have special keys on most keyboards.
In ASCII, C-i and TAB are the same character. If the
terminal can distinguish between them, Emacs conveys the distinction to
Lisp programs by representing the former as the integer 9, and the
latter as the symbol tab.
Most of the time, it’s not useful to distinguish the two. So normally
local-function-key-map (see section Keymaps for Translating Sequences of Events) is set up
to map tab into 9. Thus, a key binding for character code 9
(the character C-i) also applies to tab. Likewise for
the other symbols in this group. The function read-char
likewise converts these events into characters.
In ASCII, BS is really C-h. But backspace
converts into the character code 127 (DEL), not into code 8
(BS). This is what most users prefer.
left, up, right, downCursor arrow keys
kp-add, kp-decimal, kp-divide, …Keypad keys (to the right of the regular keyboard).
kp-0, kp-1, …Keypad keys with digits.
kp-f1, kp-f2, kp-f3, kp-f4Keypad PF keys.
kp-home, kp-left, kp-up, kp-right, kp-downKeypad arrow keys. Emacs normally translates these into the
corresponding non-keypad keys home, left, …
kp-prior, kp-next, kp-end, kp-begin, kp-insert, kp-deleteAdditional keypad duplicates of keys ordinarily found elsewhere. Emacs normally translates these into the like-named non-keypad keys.
You can use the modifier keys ALT, CTRL, HYPER, META, SHIFT, and SUPER with function keys. The way to represent them is with prefixes in the symbol name:
The alt modifier.
The control modifier.
The hyper modifier.
The meta modifier.
The shift modifier.
The super modifier.
Thus, the symbol for the key F3 with META held down is
M-f3. When you use more than one prefix, we recommend you
write them in alphabetical order; but the order does not matter in
arguments to the key-binding lookup and modification functions.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs supports four kinds of mouse events: click events, drag events, button-down events, and motion events. All mouse events are represented as lists. The CAR of the list is the event type; this says which mouse button was involved, and which modifier keys were used with it. The event type can also distinguish double or triple button presses (see section Repeat Events). The rest of the list elements give position and time information.
For key lookup, only the event type matters: two events of the same type
necessarily run the same command. The command can access the full
values of these events using the ‘e’ interactive code.
See section Code Characters for interactive.
A key sequence that starts with a mouse event is read using the keymaps of the buffer in the window that the mouse was in, not the current buffer. This does not imply that clicking in a window selects that window or its buffer—that is entirely under the control of the command binding of the key sequence.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When the user presses a mouse button and releases it at the same location, that generates a click event. All mouse click event share the same format:
(event-type position click-count)
This is a symbol that indicates which mouse button was used. It is
one of the symbols mouse-1, mouse-2, …, where the
buttons are numbered left to right.
You can also use prefixes ‘A-’, ‘C-’, ‘H-’, ‘M-’, ‘S-’ and ‘s-’ for modifiers alt, control, hyper, meta, shift and super, just as you would with function keys.
This symbol also serves as the event type of the event. Key bindings
describe events by their types; thus, if there is a key binding for
mouse-1, that binding would apply to all events whose
event-type is mouse-1.
This is a mouse position list specifying where the mouse click occurred; see below for details.
This is the number of rapid repeated presses so far of the same mouse button. See section Repeat Events.
To access the contents of a mouse position list in the position slot of a click event, you should typically use the functions documented in Accessing Mouse Events. The explicit format of the list depends on where the click occurred. For clicks in the text area, mode line, header line, or in the fringe or marginal areas, the mouse position list has the form
(window pos-or-area (x . y) timestamp object text-pos (col . row) image (dx . dy) (width . height))
The meanings of these list elements are as follows:
The window in which the click occurred.
The buffer position of the character clicked on in the text area; or,
if the click was outside the text area, the window area where it
occurred. It is one of the symbols mode-line,
header-line, vertical-line, left-margin,
right-margin, left-fringe, or right-fringe.
In one special case, pos-or-area is a list containing a symbol (one of the symbols listed above) instead of just the symbol. This happens after the imaginary prefix keys for the event are registered by Emacs. See section Key Sequence Input.
The relative pixel coordinates of the click. For clicks in the text
area of a window, the coordinate origin (0 . 0) is taken to be
the top left corner of the text area. See section Window Sizes. For
clicks in a mode line or header line, the coordinate origin is the top
left corner of the window itself. For fringes, margins, and the
vertical border, x does not have meaningful data. For fringes
and margins, y is relative to the bottom edge of the header
line. In all cases, the x and y coordinates increase
rightward and downward respectively.
The time at which the event occurred, as an integer number of milliseconds since a system-dependent initial time.
Either nil if there is no string-type text property at the
click position, or a cons cell of the form (string
. string-pos) if there is one:
The string which was clicked on, including any properties.
The position in the string where the click occurred.
For clicks on a marginal area or on a fringe, this is the buffer position of the first visible character in the corresponding line in the window. For other events, it is the current buffer position in the window.
These are the actual column and row coordinate numbers of the glyph under the x, y position. If x lies beyond the last column of actual text on its line, col is reported by adding fictional extra columns that have the default character width. Row 0 is taken to be the header line if the window has one, or the topmost row of the text area otherwise. Column 0 is taken to be the leftmost column of the text area for clicks on a window text area, or the leftmost mode line or header line column for clicks there. For clicks on fringes or vertical borders, these have no meaningful data. For clicks on margins, col is measured from the left edge of the margin area and row is measured from the top of the margin area.
This is the image object on which the click occurred. It is either
nil if there is no image at the position clicked on, or it is
an image object as returned by find-image if click was in an image.
These are the pixel coordinates of the click, relative to
the top left corner of object, which is (0 . 0). If
object is nil, the coordinates are relative to the top
left corner of the character glyph clicked on.
These are the pixel width and height of object or, if this is
nil, those of the character glyph clicked on.
For clicks on a scroll bar, position has this form:
(window area (portion . whole) timestamp part)
The window whose scroll bar was clicked on.
This is the symbol vertical-scroll-bar.
The number of pixels from the top of the scroll bar to the click
position. On some toolkits, including GTK+, Emacs cannot extract this
data, so the value is always 0.
The total length, in pixels, of the scroll bar. On some toolkits,
including GTK+, Emacs cannot extract this data, so the value is always
0.
The time at which the event occurred, in milliseconds. On some
toolkits, including GTK+, Emacs cannot extract this data, so the value
is always 0.
The part of the scroll bar on which the click occurred. It is one of
the symbols handle (the scroll bar handle), above-handle
(the area above the handle), below-handle (the area below the
handle), up (the up arrow at one end of the scroll bar), or
down (the down arrow at one end of the scroll bar).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
With Emacs, you can have a drag event without even changing your clothes. A drag event happens every time the user presses a mouse button and then moves the mouse to a different character position before releasing the button. Like all mouse events, drag events are represented in Lisp as lists. The lists record both the starting mouse position and the final position, like this:
(event-type (window1 START-POSITION) (window2 END-POSITION))
For a drag event, the name of the symbol event-type contains the
prefix ‘drag-’. For example, dragging the mouse with button 2
held down generates a drag-mouse-2 event. The second and third
elements of the event give the starting and ending position of the
drag, as mouse position lists (see section Click Events). You can access
the second element of any mouse event in the same way. However, the
drag event may end outside the boundaries of the frame that was
initially selected. In that case, the third element’s position list
contains that frame in place of a window.
The ‘drag-’ prefix follows the modifier key prefixes such as ‘C-’ and ‘M-’.
If read-key-sequence receives a drag event that has no key
binding, and the corresponding click event does have a binding, it
changes the drag event into a click event at the drag’s starting
position. This means that you don’t have to distinguish between click
and drag events unless you want to.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Click and drag events happen when the user releases a mouse button. They cannot happen earlier, because there is no way to distinguish a click from a drag until the button is released.
If you want to take action as soon as a button is pressed, you need to handle button-down events.11 These occur as soon as a button is pressed. They are represented by lists that look exactly like click events (see section Click Events), except that the event-type symbol name contains the prefix ‘down-’. The ‘down-’ prefix follows modifier key prefixes such as ‘C-’ and ‘M-’.
The function read-key-sequence ignores any button-down events
that don’t have command bindings; therefore, the Emacs command loop
ignores them too. This means that you need not worry about defining
button-down events unless you want them to do something. The usual
reason to define a button-down event is so that you can track mouse
motion (by reading motion events) until the button is released.
See section Motion Events.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If you press the same mouse button more than once in quick succession without moving the mouse, Emacs generates special repeat mouse events for the second and subsequent presses.
The most common repeat events are double-click events. Emacs generates a double-click event when you click a button twice; the event happens when you release the button (as is normal for all click events).
The event type of a double-click event contains the prefix
‘double-’. Thus, a double click on the second mouse button with
meta held down comes to the Lisp program as
M-double-mouse-2. If a double-click event has no binding, the
binding of the corresponding ordinary click event is used to execute
it. Thus, you need not pay attention to the double click feature
unless you really want to.
When the user performs a double click, Emacs generates first an ordinary click event, and then a double-click event. Therefore, you must design the command binding of the double click event to assume that the single-click command has already run. It must produce the desired results of a double click, starting from the results of a single click.
This is convenient, if the meaning of a double click somehow “builds on” the meaning of a single click—which is recommended user interface design practice for double clicks.
If you click a button, then press it down again and start moving the mouse with the button held down, then you get a double-drag event when you ultimately release the button. Its event type contains ‘double-drag’ instead of just ‘drag’. If a double-drag event has no binding, Emacs looks for an alternate binding as if the event were an ordinary drag.
Before the double-click or double-drag event, Emacs generates a double-down event when the user presses the button down for the second time. Its event type contains ‘double-down’ instead of just ‘down’. If a double-down event has no binding, Emacs looks for an alternate binding as if the event were an ordinary button-down event. If it finds no binding that way either, the double-down event is ignored.
To summarize, when you click a button and then press it again right away, Emacs generates a down event and a click event for the first click, a double-down event when you press the button again, and finally either a double-click or a double-drag event.
If you click a button twice and then press it again, all in quick succession, Emacs generates a triple-down event, followed by either a triple-click or a triple-drag. The event types of these events contain ‘triple’ instead of ‘double’. If any triple event has no binding, Emacs uses the binding that it would use for the corresponding double event.
If you click a button three or more times and then press it again, the events for the presses beyond the third are all triple events. Emacs does not have separate event types for quadruple, quintuple, etc. events. However, you can look at the event list to find out precisely how many times the button was pressed.
This function returns the number of consecutive button presses that led up to event. If event is a double-down, double-click or double-drag event, the value is 2. If event is a triple event, the value is 3 or greater. If event is an ordinary mouse event (not a repeat event), the value is 1.
To generate repeat events, successive mouse button presses must be at
approximately the same screen position. The value of
double-click-fuzz specifies the maximum number of pixels the
mouse may be moved (horizontally or vertically) between two successive
clicks to make a double-click.
This variable is also the threshold for motion of the mouse to count as a drag.
To generate repeat events, the number of milliseconds between
successive button presses must be less than the value of
double-click-time. Setting double-click-time to
nil disables multi-click detection entirely. Setting it to
t removes the time limit; Emacs then detects multi-clicks by
position only.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs sometimes generates mouse motion events to describe motion of the mouse without any button activity. Mouse motion events are represented by lists that look like this:
(mouse-movement POSITION)
position is a mouse position list (see section Click Events), specifying the current position of the mouse cursor. As with the end-position of a drag event, this position list may represent a location outside the boundaries of the initially selected frame, in which case the list contains that frame in place of a window.
The special form track-mouse enables generation of motion
events within its body. Outside of track-mouse forms, Emacs
does not generate events for mere motion of the mouse, and these
events do not appear. See section Mouse Tracking.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Window systems provide general ways for the user to control which window gets keyboard input. This choice of window is called the focus. When the user does something to switch between Emacs frames, that generates a focus event. The normal definition of a focus event, in the global keymap, is to select a new frame within Emacs, as the user would expect. See section Input Focus.
Focus events are represented in Lisp as lists that look like this:
(switch-frame new-frame)
where new-frame is the frame switched to.
Some X window managers are set up so that just moving the mouse into a window is enough to set the focus there. Usually, there is no need for a Lisp program to know about the focus change until some other kind of input arrives. Emacs generates a focus event only when the user actually types a keyboard key or presses a mouse button in the new frame; just moving the mouse between frames does not generate a focus event.
A focus event in the middle of a key sequence would garble the sequence. So Emacs never generates a focus event in the middle of a key sequence. If the user changes focus in the middle of a key sequence—that is, after a prefix key—then Emacs reorders the events so that the focus event comes either before or after the multi-event key sequence, and not within it.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A few other event types represent occurrences within the system.
(delete-frame (frame))This kind of event indicates that the user gave the window manager a command to delete a particular window, which happens to be an Emacs frame.
The standard definition of the delete-frame event is to delete frame.
(iconify-frame (frame))This kind of event indicates that the user iconified frame using
the window manager. Its standard definition is ignore; since the
frame has already been iconified, Emacs has no work to do. The purpose
of this event type is so that you can keep track of such events if you
want to.
(make-frame-visible (frame))This kind of event indicates that the user deiconified frame using
the window manager. Its standard definition is ignore; since the
frame has already been made visible, Emacs has no work to do.
(wheel-up position)(wheel-down position)These kinds of event are generated by moving a mouse wheel. The position element is a mouse position list (see section Click Events), specifying the position of the mouse cursor when the event occurred.
This kind of event is generated only on some kinds of systems. On some
systems, mouse-4 and mouse-5 are used instead. For
portable code, use the variables mouse-wheel-up-event and
mouse-wheel-down-event defined in mwheel.el to determine
what event types to expect for the mouse wheel.
(drag-n-drop position files)This kind of event is generated when a group of files is selected in an application outside of Emacs, and then dragged and dropped onto an Emacs frame.
The element position is a list describing the position of the event, in the same format as used in a mouse-click event (see section Click Events), and files is the list of file names that were dragged and dropped. The usual way to handle this event is by visiting these files.
This kind of event is generated, at present, only on some kinds of systems.
help-echoThis kind of event is generated when a mouse pointer moves onto a
portion of buffer text which has a help-echo text property.
The generated event has this form:
(help-echo frame help window object pos)
The precise meaning of the event parameters and the way these parameters are used to display the help-echo text are described in Text help-echo.
sigusr1sigusr2These events are generated when the Emacs process receives
the signals SIGUSR1 and SIGUSR2. They contain no
additional data because signals do not carry additional information.
They can be useful for debugging (see section Entering the Debugger on an Error).
To catch a user signal, bind the corresponding event to an interactive
command in the special-event-map (see section Active Keymaps).
The command is called with no arguments, and the specific signal event is
available in last-input-event. For example:
(defun sigusr-handler () (interactive) (message "Caught signal %S" last-input-event)) (define-key special-event-map [sigusr1] 'sigusr-handler)
To test the signal handler, you can make Emacs send a signal to itself:
(signal-process (emacs-pid) 'sigusr1)
language-changeThis kind of event is generated on MS-Windows when the input language has changed. This typically means that the keyboard keys will send to Emacs characters from a different language. The generated event has this form:
(language-change frame codepage language-id)
Here frame is the frame which was current when the input
language changed; codepage is the new codepage number; and
language-id is the numerical ID of the new input language. The
coding-system (see section Coding Systems) that corresponds to
codepage is cpcodepage or
windows-codepage. To convert language-id to a
string (e.g., to use it for various language-dependent features, such
as set-language-environment), use the
w32-get-locale-info function, like this:
;; Get the abbreviated language name, such as "ENU" for English (w32-get-locale-info language-id) ;; Get the full English name of the language, ;; such as "English (United States)" (w32-get-locale-info language-id 4097) ;; Get the full localized name of the language (w32-get-locale-info language-id t)
If one of these events arrives in the middle of a key sequence—that is, after a prefix key—then Emacs reorders the events so that this event comes either before or after the multi-event key sequence, not within it.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If the user presses and releases the left mouse button over the same location, that generates a sequence of events like this:
(down-mouse-1 (#<window 18 on NEWS> 2613 (0 . 38) -864320)) (mouse-1 (#<window 18 on NEWS> 2613 (0 . 38) -864180))
While holding the control key down, the user might hold down the second mouse button, and drag the mouse from one line to the next. That produces two events, as shown here:
(C-down-mouse-2 (#<window 18 on NEWS> 3440 (0 . 27) -731219))
(C-drag-mouse-2 (#<window 18 on NEWS> 3440 (0 . 27) -731219)
(#<window 18 on NEWS> 3510 (0 . 28) -729648))
While holding down the meta and shift keys, the user might press the second mouse button on the window’s mode line, and then drag the mouse into another window. That produces a pair of events like these:
(M-S-down-mouse-2 (#<window 18 on NEWS> mode-line (33 . 31) -457844))
(M-S-drag-mouse-2 (#<window 18 on NEWS> mode-line (33 . 31) -457844)
(#<window 20 on carlton-sanskrit.tex> 161 (33 . 3)
-453816))
The frame with input focus might not take up the entire screen, and
the user might move the mouse outside the scope of the frame. Inside
the track-mouse special form, that produces an event like this:
(mouse-movement (#<frame *ielm* 0x102849a30> nil (563 . 205) 532301936))
To handle a SIGUSR1 signal, define an interactive function, and
bind it to the signal usr1 event sequence:
(defun usr1-handler () (interactive) (message "Got USR1 signal")) (global-set-key [signal usr1] 'usr1-handler)
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Every event has an event type, which classifies the event for key binding purposes. For a keyboard event, the event type equals the event value; thus, the event type for a character is the character, and the event type for a function key symbol is the symbol itself. For events that are lists, the event type is the symbol in the CAR of the list. Thus, the event type is always a symbol or a character.
Two events of the same type are equivalent where key bindings are concerned; thus, they always run the same command. That does not necessarily mean they do the same things, however, as some commands look at the whole event to decide what to do. For example, some commands use the location of a mouse event to decide where in the buffer to act.
Sometimes broader classifications of events are useful. For example, you might want to ask whether an event involved the META key, regardless of which other key or mouse button was used.
The functions event-modifiers and event-basic-type are
provided to get such information conveniently.
This function returns a list of the modifiers that event has. The
modifiers are symbols; they include shift, control,
meta, alt, hyper and super. In addition,
the modifiers list of a mouse event symbol always contains one of
click, drag, and down. For double or triple
events, it also contains double or triple.
The argument event may be an entire event object, or just an
event type. If event is a symbol that has never been used in an
event that has been read as input in the current Emacs session, then
event-modifiers can return nil, even when event
actually has modifiers.
Here are some examples:
(event-modifiers ?a)
⇒ nil
(event-modifiers ?A)
⇒ (shift)
(event-modifiers ?\C-a)
⇒ (control)
(event-modifiers ?\C-%)
⇒ (control)
(event-modifiers ?\C-\S-a)
⇒ (control shift)
(event-modifiers 'f5)
⇒ nil
(event-modifiers 's-f5)
⇒ (super)
(event-modifiers 'M-S-f5)
⇒ (meta shift)
(event-modifiers 'mouse-1)
⇒ (click)
(event-modifiers 'down-mouse-1)
⇒ (down)
The modifiers list for a click event explicitly contains click,
but the event symbol name itself does not contain ‘click’.
This function returns the key or mouse button that event
describes, with all modifiers removed. The event argument is as
in event-modifiers. For example:
(event-basic-type ?a)
⇒ 97
(event-basic-type ?A)
⇒ 97
(event-basic-type ?\C-a)
⇒ 97
(event-basic-type ?\C-\S-a)
⇒ 97
(event-basic-type 'f5)
⇒ f5
(event-basic-type 's-f5)
⇒ f5
(event-basic-type 'M-S-f5)
⇒ f5
(event-basic-type 'down-mouse-1)
⇒ mouse-1
This function returns non-nil if object is a mouse movement
event.
This function converts a list of modifier names and a basic event type to an event type which specifies all of them. The basic event type must be the last element of the list. For example,
(event-convert-list '(control ?a))
⇒ 1
(event-convert-list '(control meta ?a))
⇒ -134217727
(event-convert-list '(control super f1))
⇒ C-s-f1
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes convenient functions for accessing the data in
a mouse button or motion event. Keyboard event data can be accessed
using the same functions, but data elements that aren’t applicable to
keyboard events are zero or nil.
The following two functions return a mouse position list (see section Click Events), specifying the position of a mouse event.
This returns the starting position of event.
If event is a click or button-down event, this returns the location of the event. If event is a drag event, this returns the drag’s starting position.
This returns the ending position of event.
If event is a drag event, this returns the position where the user released the mouse button. If event is a click or button-down event, the value is actually the starting position, which is the only position such events have.
This function returns non-nil if object is a mouse
position list, in either of the formats documented in Click Events); and nil otherwise.
These functions take a mouse position list as argument, and return various parts of it:
Return the window that position is in. If position represents a location outside the frame where the event was initiated, return that frame instead.
Return the window area recorded in position. It returns nil
when the event occurred in the text area of the window; otherwise, it
is a symbol identifying the area in which the event occurred.
Return the buffer position in position. When the event occurred in the text area of the window, in a marginal area, or on a fringe, this is an integer specifying a buffer position. Otherwise, the value is undefined.
Return the pixel-based x and y coordinates in position, as a
cons cell (x . y). These coordinates are relative
to the window given by posn-window.
This example shows how to convert the window-relative coordinates in the text area of a window into frame-relative coordinates:
(defun frame-relative-coordinates (position)
"Return frame-relative coordinates from POSITION.
POSITION is assumed to lie in a window text area."
(let* ((x-y (posn-x-y position))
(window (posn-window position))
(edges (window-inside-pixel-edges window)))
(cons (+ (car x-y) (car edges))
(+ (cdr x-y) (cadr edges)))))
This function returns a cons cell (col . row),
containing the estimated column and row corresponding to buffer
position in position. The return value is given in units of the
frame’s default character width and default line height (including
spacing), as computed from the x and y values
corresponding to position. (So, if the actual characters have
non-default sizes, the actual row and column may differ from these
computed values.)
Note that row is counted from the top of the text area. If the window given by position possesses a header line (see section Window Header Lines), it is not included in the row count.
Return the actual row and column in position, as a cons cell
(col . row). The values are the actual row and
column numbers in the window given by position. See section Click Events, for details. The function returns nil if
position does not include actual position values; in that case
posn-col-row can be used to get approximate values.
Note that this function doesn’t account for the visual width of
characters on display, like the number of visual columns taken by a
tab character or an image. If you need the coordinates in canonical
character units, use posn-col-row instead.
Return the string object in position, either nil, or a
cons cell (string . string-pos).
Return the image object in position, either nil, or an
image (image ...).
Return the image or string object in position, either
nil, an image (image ...), or a cons cell
(string . string-pos).
Return the pixel-based x and y coordinates relative to the upper left
corner of the object in position as a cons cell (dx
. dy). If the position is on buffer text, return the
relative position of the buffer-text character closest to that
position.
Return the pixel width and height of the object in position as a
cons cell (width . height). If the position
is a buffer position, return the size of the character at that position.
Return the timestamp in position. This is the time at which the event occurred, in milliseconds.
These functions compute a position list given particular buffer position or screen position. You can access the data in this position list with the functions described above.
This function returns a position list for position pos in window. pos defaults to point in window; window defaults to the selected window.
posn-at-point returns nil if pos is not visible in
window.
This function returns position information corresponding to pixel
coordinates x and y in a specified frame or window,
frame-or-window, which defaults to the selected window.
The coordinates x and y are relative to the
frame or window used.
If whole is nil, the coordinates are relative
to the window text area, otherwise they are relative to
the entire window area including scroll bars, margins and fringes.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These functions are useful for decoding scroll bar events.
This function returns the fractional vertical position of a scroll bar
event within the scroll bar. The value is a cons cell
(portion . whole) containing two integers whose ratio
is the fractional position.
This function multiplies (in effect) ratio by total,
rounding the result to an integer. The argument ratio is not a
number, but rather a pair (num . denom)—typically a
value returned by scroll-bar-event-ratio.
This function is handy for scaling a position on a scroll bar into a buffer position. Here’s how to do that:
(+ (point-min)
(scroll-bar-scale
(posn-x-y (event-start event))
(- (point-max) (point-min))))
Recall that scroll bar events have two integers forming a ratio, in place of a pair of x and y coordinates.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In most of the places where strings are used, we conceptualize the string as containing text characters—the same kind of characters found in buffers or files. Occasionally Lisp programs use strings that conceptually contain keyboard characters; for example, they may be key sequences or keyboard macro definitions. However, storing keyboard characters in a string is a complex matter, for reasons of historical compatibility, and it is not always possible.
We recommend that new programs avoid dealing with these complexities by not storing keyboard events in strings. Here is how to do that:
lookup-key and
define-key. For example, you can use
read-key-sequence-vector instead of read-key-sequence, and
this-command-keys-vector instead of this-command-keys.
define-key.
listify-key-sequence (see section Miscellaneous Event Input Features)
first, to convert it to a list.
The complexities stem from the modifier bits that keyboard input characters can include. Aside from the Meta modifier, none of these modifier bits can be included in a string, and the Meta modifier is allowed only in special cases.
The earliest GNU Emacs versions represented meta characters as codes
in the range of 128 to 255. At that time, the basic character codes
ranged from 0 to 127, so all keyboard character codes did fit in a
string. Many Lisp programs used ‘\M-’ in string constants to stand
for meta characters, especially in arguments to define-key and
similar functions, and key sequences and sequences of events were always
represented as strings.
When we added support for larger basic character codes beyond 127, and additional modifier bits, we had to change the representation of meta characters. Now the flag that represents the Meta modifier in a character is 2**27 and such numbers cannot be included in a string.
To support programs with ‘\M-’ in string constants, there are special rules for including certain meta characters in a string. Here are the rules for interpreting a string as a sequence of input characters:
Functions such as read-key-sequence that construct strings of
keyboard input characters follow these rules: they construct vectors
instead of strings, when the events won’t fit in a string.
When you use the read syntax ‘\M-’ in a string, it produces a code in the range of 128 to 255—the same code that you get if you modify the corresponding keyboard event to put it in the string. Thus, meta events in strings work consistently regardless of how they get into the strings.
However, most programs would do well to avoid these issues by following the recommendations at the beginning of this section.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The editor command loop reads key sequences using the function
read-key-sequence, which uses read-event. These and other
functions for event input are also available for use in Lisp programs.
See also momentary-string-display in Temporary Displays,
and sit-for in Waiting for Elapsed Time or Input. See section Terminal Input, for
functions and variables for controlling terminal input modes and
debugging terminal input.
For higher-level input facilities, see Minibuffers.
| 20.8.1 Key Sequence Input | How to read one key sequence. | |
| 20.8.2 Reading One Event | How to read just one event. | |
| 20.8.3 Modifying and Translating Input Events | How Emacs modifies events as they are read. | |
| 20.8.4 Invoking the Input Method | How reading an event uses the input method. | |
| 20.8.5 Quoted Character Input | Asking the user to specify a character. | |
| 20.8.6 Miscellaneous Event Input Features | How to reread or throw away input events. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The command loop reads input a key sequence at a time, by calling
read-key-sequence. Lisp programs can also call this function;
for example, describe-key uses it to read the key to describe.
This function reads a key sequence and returns it as a string or vector. It keeps reading events until it has accumulated a complete key sequence; that is, enough to specify a non-prefix command using the currently active keymaps. (Remember that a key sequence that starts with a mouse event is read using the keymaps of the buffer in the window that the mouse was in, not the current buffer.)
If the events are all characters and all can fit in a string, then
read-key-sequence returns a string (see section Putting Keyboard Events in Strings).
Otherwise, it returns a vector, since a vector can hold all kinds of
events—characters, symbols, and lists. The elements of the string or
vector are the events in the key sequence.
Reading a key sequence includes translating the events in various ways. See section Keymaps for Translating Sequences of Events.
The argument prompt is either a string to be displayed in the
echo area as a prompt, or nil, meaning not to display a prompt.
The argument continue-echo, if non-nil, means to echo
this key as a continuation of the previous key.
Normally any upper case event is converted to lower case if the
original event is undefined and the lower case equivalent is defined.
The argument dont-downcase-last, if non-nil, means do not
convert the last event to lower case. This is appropriate for reading
a key sequence to be defined.
The argument switch-frame-ok, if non-nil, means that this
function should process a switch-frame event if the user
switches frames before typing anything. If the user switches frames
in the middle of a key sequence, or at the start of the sequence but
switch-frame-ok is nil, then the event will be put off
until after the current key sequence.
The argument command-loop, if non-nil, means that this
key sequence is being read by something that will read commands one
after another. It should be nil if the caller will read just
one key sequence.
In the following example, Emacs displays the prompt ‘?’ in the echo area, and then the user types C-x C-f.
(read-key-sequence "?")
---------- Echo Area ----------
?C-x C-f
---------- Echo Area ----------
⇒ "^X^F"
The function read-key-sequence suppresses quitting: C-g
typed while reading with this function works like any other character,
and does not set quit-flag. See section Quitting.
This is like read-key-sequence except that it always
returns the key sequence as a vector, never as a string.
See section Putting Keyboard Events in Strings.
If an input character is upper-case (or has the shift modifier) and
has no key binding, but its lower-case equivalent has one, then
read-key-sequence converts the character to lower case. Note
that lookup-key does not perform case conversion in this way.
When reading input results in such a shift-translation, Emacs
sets the variable this-command-keys-shift-translated to a
non-nil value. Lisp programs can examine this variable if they
need to modify their behavior when invoked by shift-translated keys.
For example, the function handle-shift-selection examines the
value of this variable to determine how to activate or deactivate the
region (see section handle-shift-selection).
The function read-key-sequence also transforms some mouse events.
It converts unbound drag events into click events, and discards unbound
button-down events entirely. It also reshuffles focus events and
miscellaneous window events so that they never appear in a key sequence
with any other events.
When mouse events occur in special parts of a window, such as a mode
line or a scroll bar, the event type shows nothing special—it is the
same symbol that would normally represent that combination of mouse
button and modifier keys. The information about the window part is kept
elsewhere in the event—in the coordinates. But
read-key-sequence translates this information into imaginary
“prefix keys”, all of which are symbols: header-line,
horizontal-scroll-bar, menu-bar, mode-line,
vertical-line, and vertical-scroll-bar. You can define
meanings for mouse clicks in special window parts by defining key
sequences using these imaginary prefix keys.
For example, if you call read-key-sequence and then click the
mouse on the window’s mode line, you get two events, like this:
(read-key-sequence "Click on the mode line: ")
⇒ [mode-line
(mouse-1
(#<window 6 on NEWS> mode-line
(40 . 63) 5959987))]
This variable’s value is the number of key sequences processed so far in this Emacs session. This includes key sequences read from the terminal and key sequences read from keyboard macros being executed.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The lowest level functions for command input are read-event,
read-char, and read-char-exclusive.
This function reads and returns the next event of command input, waiting if necessary until an event is available.
The returned event may come directly from the user, or from a keyboard macro. It is not decoded by the keyboard’s input coding system (see section Terminal I/O Encoding).
If the optional argument prompt is non-nil, it should be a
string to display in the echo area as a prompt. Otherwise,
read-event does not display any message to indicate it is waiting
for input; instead, it prompts by echoing: it displays descriptions of
the events that led to or were read by the current command. See section The Echo Area.
If inherit-input-method is non-nil, then the current input
method (if any) is employed to make it possible to enter a
non-ASCII character. Otherwise, input method handling is disabled
for reading this event.
If cursor-in-echo-area is non-nil, then read-event
moves the cursor temporarily to the echo area, to the end of any message
displayed there. Otherwise read-event does not move the cursor.
If seconds is non-nil, it should be a number specifying
the maximum time to wait for input, in seconds. If no input arrives
within that time, read-event stops waiting and returns
nil. A floating point seconds means to wait
for a fractional number of seconds. Some systems support only a whole
number of seconds; on these systems, seconds is rounded down.
If seconds is nil, read-event waits as long as
necessary for input to arrive.
If seconds is nil, Emacs is considered idle while waiting
for user input to arrive. Idle timers—those created with
run-with-idle-timer (see section Idle Timers)—can run during this
period. However, if seconds is non-nil, the state of
idleness remains unchanged. If Emacs is non-idle when
read-event is called, it remains non-idle throughout the
operation of read-event; if Emacs is idle (which can happen if
the call happens inside an idle timer), it remains idle.
If read-event gets an event that is defined as a help character,
then in some cases read-event processes the event directly without
returning. See section Help Functions. Certain other events, called
special events, are also processed directly within
read-event (see section Special Events).
Here is what happens if you call read-event and then press the
right-arrow function key:
(read-event)
⇒ right
This function reads and returns a character of command input. If the
user generates an event which is not a character (i.e., a mouse click or
function key event), read-char signals an error. The arguments
work as in read-event.
In the first example, the user types the character 1 (ASCII
code 49). The second example shows a keyboard macro definition that
calls read-char from the minibuffer using eval-expression.
read-char reads the keyboard macro’s very next character, which
is 1. Then eval-expression displays its return value in
the echo area.
(read-char)
⇒ 49
;; We assume here you use M-: to evaluate this.
(symbol-function 'foo)
⇒ "^[:(read-char)^M1"
(execute-kbd-macro 'foo)
-| 49
⇒ nil
This function reads and returns a character of command input. If the
user generates an event which is not a character,
read-char-exclusive ignores it and reads another event, until it
gets a character. The arguments work as in read-event.
None of the above functions suppress quitting.
This variable holds the total number of input events received so far from the terminal—not counting those generated by keyboard macros.
We emphasize that, unlike read-key-sequence, the functions
read-event, read-char, and read-char-exclusive do
not perform the translations described in Keymaps for Translating Sequences of Events.
If you wish to read a single key taking these translations into
account, use the function read-key:
This function reads a single key. It is “intermediate” between
read-key-sequence and read-event. Unlike the former, it
reads a single key, not a key sequence. Unlike the latter, it does
not return a raw event, but decodes and translates the user input
according to input-decode-map, local-function-key-map,
and key-translation-map (see section Keymaps for Translating Sequences of Events).
The argument prompt is either a string to be displayed in the
echo area as a prompt, or nil, meaning not to display a prompt.
This function uses read-key to read and return a single
character. It ignores any input that is not a member of chars,
a list of accepted characters. Optionally, it will also ignore
keyboard-quit events while it is waiting for valid input. If you bind
help-form (see section Help Functions) to a non-nil value
while calling read-char-choice, then pressing help-char
causes it to evaluate help-form and display the result. It
then continues to wait for a valid input character, or keyboard-quit.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs modifies every event it reads according to
extra-keyboard-modifiers, then translates it through
keyboard-translate-table (if applicable), before returning it
from read-event.
This variable lets Lisp programs “press” the modifier keys on the
keyboard. The value is a character. Only the modifiers of the
character matter. Each time the user types a keyboard key, it is
altered as if those modifier keys were held down. For instance, if
you bind extra-keyboard-modifiers to ?\C-\M-a, then all
keyboard input characters typed during the scope of the binding will
have the control and meta modifiers applied to them. The character
?\C-@, equivalent to the integer 0, does not count as a control
character for this purpose, but as a character with no modifiers.
Thus, setting extra-keyboard-modifiers to zero cancels any
modification.
When using a window system, the program can “press” any of the modifier keys in this way. Otherwise, only the CTL and META keys can be virtually pressed.
Note that this variable applies only to events that really come from the keyboard, and has no effect on mouse events or any other events.
This terminal-local variable is the translate table for keyboard
characters. It lets you reshuffle the keys on the keyboard without
changing any command bindings. Its value is normally a char-table, or
else nil. (It can also be a string or vector, but this is
considered obsolete.)
If keyboard-translate-table is a char-table
(see section Char-Tables), then each character read from the keyboard is
looked up in this char-table. If the value found there is
non-nil, then it is used instead of the actual input character.
Note that this translation is the first thing that happens to a
character after it is read from the terminal. Record-keeping features
such as recent-keys and dribble files record the characters after
translation.
Note also that this translation is done before the characters are
supplied to input methods (see section Input Methods). Use
translation-table-for-input (see section Translation of Characters),
if you want to translate characters after input methods operate.
This function modifies keyboard-translate-table to translate
character code from into character code to. It creates
the keyboard translate table if necessary.
Here’s an example of using the keyboard-translate-table to
make C-x, C-c and C-v perform the cut, copy and paste
operations:
(keyboard-translate ?\C-x 'control-x) (keyboard-translate ?\C-c 'control-c) (keyboard-translate ?\C-v 'control-v) (global-set-key [control-x] 'kill-region) (global-set-key [control-c] 'kill-ring-save) (global-set-key [control-v] 'yank)
On a graphical terminal that supports extended ASCII input, you can still get the standard Emacs meanings of one of those characters by typing it with the shift key. That makes it a different character as far as keyboard translation is concerned, but it has the same usual meaning.
See section Keymaps for Translating Sequences of Events, for mechanisms that translate event sequences
at the level of read-key-sequence.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The event-reading functions invoke the current input method, if any
(see section Input Methods). If the value of input-method-function
is non-nil, it should be a function; when read-event reads
a printing character (including SPC) with no modifier bits, it
calls that function, passing the character as an argument.
If this is non-nil, its value specifies the current input method
function.
Warning: don’t bind this variable with let. It is often
buffer-local, and if you bind it around reading input (which is exactly
when you would bind it), switching buffers asynchronously while
Emacs is waiting will cause the value to be restored in the wrong
buffer.
The input method function should return a list of events which should
be used as input. (If the list is nil, that means there is no
input, so read-event waits for another event.) These events are
processed before the events in unread-command-events
(see section Miscellaneous Event Input Features). Events
returned by the input method function are not passed to the input method
function again, even if they are printing characters with no modifier
bits.
If the input method function calls read-event or
read-key-sequence, it should bind input-method-function to
nil first, to prevent recursion.
The input method function is not called when reading the second and
subsequent events of a key sequence. Thus, these characters are not
subject to input method processing. The input method function should
test the values of overriding-local-map and
overriding-terminal-local-map; if either of these variables is
non-nil, the input method should put its argument into a list and
return that list with no further processing.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can use the function read-quoted-char to ask the user to
specify a character, and allow the user to specify a control or meta
character conveniently, either literally or as an octal character code.
The command quoted-insert uses this function.
This function is like read-char, except that if the first
character read is an octal digit (0–7), it reads any number of octal
digits (but stopping if a non-octal digit is found), and returns the
character represented by that numeric character code. If the
character that terminates the sequence of octal digits is RET,
it is discarded. Any other terminating character is used as input
after this function returns.
Quitting is suppressed when the first character is read, so that the user can enter a C-g. See section Quitting.
If prompt is supplied, it specifies a string for prompting the user. The prompt string is always displayed in the echo area, followed by a single ‘-’.
In the following example, the user types in the octal number 177 (which is 127 in decimal).
(read-quoted-char "What character")
---------- Echo Area ----------
What character 1 7 7-
---------- Echo Area ----------
⇒ 127
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes how to “peek ahead” at events without using
them up, how to check for pending input, and how to discard pending
input. See also the function read-passwd (see section Reading a Password).
This variable holds a list of events waiting to be read as command input. The events are used in the order they appear in the list, and removed one by one as they are used.
The variable is needed because in some cases a function reads an event and then decides not to use it. Storing the event in this variable causes it to be processed normally, by the command loop or by the functions to read command input.
For example, the function that implements numeric prefix arguments reads any number of digits. When it finds a non-digit event, it must unread the event so that it can be read normally by the command loop. Likewise, incremental search uses this feature to unread events with no special meaning in a search, because these events should exit the search and then execute normally.
The reliable and easy way to extract events from a key sequence so as
to put them in unread-command-events is to use
listify-key-sequence (see below).
Normally you add events to the front of this list, so that the events most recently unread will be reread first.
Events read from this list are not normally added to the current
command’s key sequence (as returned by, e.g., this-command-keys),
as the events will already have been added once as they were read for
the first time. An element of the form (t . event)
forces event to be added to the current command’s key sequence.
This function converts the string or vector key to a list of
individual events, which you can put in unread-command-events.
This function determines whether any command input is currently
available to be read. It returns immediately, with value t if
there is available input, nil otherwise. On rare occasions it
may return t when no input is available.
If the optional argument check-timers is non-nil, then if
no input is available, Emacs runs any timers which are ready.
See section Timers for Delayed Execution.
This variable records the last terminal input event read, whether as part of a command or explicitly by a Lisp program.
In the example below, the Lisp program reads the character 1,
ASCII code 49. It becomes the value of last-input-event,
while C-e (we assume C-x C-e command is used to evaluate
this expression) remains the value of last-command-event.
(progn (print (read-char))
(print last-command-event)
last-input-event)
-| 49
-| 5
⇒ 49
This construct runs the body forms and returns the value of the
last one—but only if no input arrives. If any input arrives during
the execution of the body forms, it aborts them (working much
like a quit). The while-no-input form returns nil if
aborted by a real quit, and returns t if aborted by arrival of
other input.
If a part of body binds inhibit-quit to non-nil,
arrival of input during those parts won’t cause an abort until
the end of that part.
If you want to be able to distinguish all possible values computed by body from both kinds of abort conditions, write the code like this:
(while-no-input
(list
(progn . body)))
This function discards the contents of the terminal input buffer and
cancels any keyboard macro that might be in the process of definition.
It returns nil.
In the following example, the user may type a number of characters right
after starting the evaluation of the form. After the sleep-for
finishes sleeping, discard-input discards any characters typed
during the sleep.
(progn (sleep-for 2)
(discard-input))
⇒ nil
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Certain special events are handled at a very low level—as soon
as they are read. The read-event function processes these
events itself, and never returns them. Instead, it keeps waiting for
the first event that is not special and returns that one.
Special events do not echo, they are never grouped into key
sequences, and they never appear in the value of
last-command-event or (this-command-keys). They do not
discard a numeric argument, they cannot be unread with
unread-command-events, they may not appear in a keyboard macro,
and they are not recorded in a keyboard macro while you are defining
one.
Special events do, however, appear in last-input-event
immediately after they are read, and this is the way for the event’s
definition to find the actual event.
The events types iconify-frame, make-frame-visible,
delete-frame, drag-n-drop, language-change, and
user signals like sigusr1 are normally handled in this way.
The keymap which defines how to handle special events—and which
events are special—is in the variable special-event-map
(see section Active Keymaps).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The wait functions are designed to wait for a certain amount of time
to pass or until there is input. For example, you may wish to pause in
the middle of a computation to allow the user time to view the display.
sit-for pauses and updates the screen, and returns immediately if
input comes in, while sleep-for pauses without updating the
screen.
This function performs redisplay (provided there is no pending input
from the user), then waits seconds seconds, or until input is
available. The usual purpose of sit-for is to give the user
time to read text that you display. The value is t if
sit-for waited the full time with no input arriving
(see section Miscellaneous Event Input Features). Otherwise, the value is nil.
The argument seconds need not be an integer. If it is floating
point, sit-for waits for a fractional number of seconds.
Some systems support only a whole number of seconds; on these systems,
seconds is rounded down.
The expression (sit-for 0) is equivalent to (redisplay),
i.e., it requests a redisplay, without any delay, if there is no pending input.
See section Forcing Redisplay.
If nodisp is non-nil, then sit-for does not
redisplay, but it still returns as soon as input is available (or when
the timeout elapses).
In batch mode (see section Batch Mode), sit-for cannot be
interrupted, even by input from the standard input descriptor. It is
thus equivalent to sleep-for, which is described below.
It is also possible to call sit-for with three arguments,
as (sit-for seconds millisec nodisp),
but that is considered obsolete.
This function simply pauses for seconds seconds without updating
the display. It pays no attention to available input. It returns
nil.
The argument seconds need not be an integer. If it is floating
point, sleep-for waits for a fractional number of seconds.
Some systems support only a whole number of seconds; on these systems,
seconds is rounded down.
The optional argument millisec specifies an additional waiting period measured in milliseconds. This adds to the period specified by seconds. If the system doesn’t support waiting fractions of a second, you get an error if you specify nonzero millisec.
Use sleep-for when you wish to guarantee a delay.
See section Time of Day, for functions to get the current time.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Typing C-g while a Lisp function is running causes Emacs to quit whatever it is doing. This means that control returns to the innermost active command loop.
Typing C-g while the command loop is waiting for keyboard input
does not cause a quit; it acts as an ordinary input character. In the
simplest case, you cannot tell the difference, because C-g
normally runs the command keyboard-quit, whose effect is to quit.
However, when C-g follows a prefix key, they combine to form an
undefined key. The effect is to cancel the prefix key as well as any
prefix argument.
In the minibuffer, C-g has a different definition: it aborts out of the minibuffer. This means, in effect, that it exits the minibuffer and then quits. (Simply quitting would return to the command loop within the minibuffer.) The reason why C-g does not quit directly when the command reader is reading input is so that its meaning can be redefined in the minibuffer in this way. C-g following a prefix key is not redefined in the minibuffer, and it has its normal effect of canceling the prefix key and prefix argument. This too would not be possible if C-g always quit directly.
When C-g does directly quit, it does so by setting the variable
quit-flag to t. Emacs checks this variable at appropriate
times and quits if it is not nil. Setting quit-flag
non-nil in any way thus causes a quit.
At the level of C code, quitting cannot happen just anywhere; only at the
special places that check quit-flag. The reason for this is
that quitting at other places might leave an inconsistency in Emacs’s
internal state. Because quitting is delayed until a safe place, quitting
cannot make Emacs crash.
Certain functions such as read-key-sequence or
read-quoted-char prevent quitting entirely even though they wait
for input. Instead of quitting, C-g serves as the requested
input. In the case of read-key-sequence, this serves to bring
about the special behavior of C-g in the command loop. In the
case of read-quoted-char, this is so that C-q can be used
to quote a C-g.
You can prevent quitting for a portion of a Lisp function by binding
the variable inhibit-quit to a non-nil value. Then,
although C-g still sets quit-flag to t as usual, the
usual result of this—a quit—is prevented. Eventually,
inhibit-quit will become nil again, such as when its
binding is unwound at the end of a let form. At that time, if
quit-flag is still non-nil, the requested quit happens
immediately. This behavior is ideal when you wish to make sure that
quitting does not happen within a “critical section” of the program.
In some functions (such as read-quoted-char), C-g is
handled in a special way that does not involve quitting. This is done
by reading the input with inhibit-quit bound to t, and
setting quit-flag to nil before inhibit-quit
becomes nil again. This excerpt from the definition of
read-quoted-char shows how this is done; it also shows that
normal quitting is permitted after the first character of input.
(defun read-quoted-char (&optional prompt)
"…documentation…"
(let ((message-log-max nil) done (first t) (code 0) char)
(while (not done)
(let ((inhibit-quit first)
…)
(and prompt (message "%s-" prompt))
(setq char (read-event))
(if inhibit-quit (setq quit-flag nil)))
…set the variable code…)
code))
If this variable is non-nil, then Emacs quits immediately, unless
inhibit-quit is non-nil. Typing C-g ordinarily sets
quit-flag non-nil, regardless of inhibit-quit.
This variable determines whether Emacs should quit when quit-flag
is set to a value other than nil. If inhibit-quit is
non-nil, then quit-flag has no special effect.
This macro executes body forms in sequence, but allows quitting, at
least locally, within body even if inhibit-quit was
non-nil outside this construct. It returns the value of the
last form in body, unless exited by quitting, in which case
it returns nil.
If inhibit-quit is nil on entry to with-local-quit,
it only executes the body, and setting quit-flag causes
a normal quit. However, if inhibit-quit is non-nil so
that ordinary quitting is delayed, a non-nil quit-flag
triggers a special kind of local quit. This ends the execution of
body and exits the with-local-quit body with
quit-flag still non-nil, so that another (ordinary) quit
will happen as soon as that is allowed. If quit-flag is
already non-nil at the beginning of body, the local quit
happens immediately and the body doesn’t execute at all.
This macro is mainly useful in functions that can be called from
timers, process filters, process sentinels, pre-command-hook,
post-command-hook, and other places where inhibit-quit is
normally bound to t.
This function signals the quit condition with (signal 'quit
nil). This is the same thing that quitting does. (See signal
in Errors.)
You can specify a character other than C-g to use for quitting.
See the function set-input-mode in Input Modes.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Most Emacs commands can use a prefix argument, a number
specified before the command itself. (Don’t confuse prefix arguments
with prefix keys.) The prefix argument is at all times represented by a
value, which may be nil, meaning there is currently no prefix
argument. Each command may use the prefix argument or ignore it.
There are two representations of the prefix argument: raw and numeric. The editor command loop uses the raw representation internally, and so do the Lisp variables that store the information, but commands can request either representation.
Here are the possible values of a raw prefix argument:
nil, meaning there is no prefix argument. Its numeric value is
1, but numerous commands make a distinction between nil and the
integer 1.
-. This indicates that M-- or C-u - was
typed, without following digits. The equivalent numeric value is
-1, but some commands make a distinction between the integer
-1 and the symbol -.
We illustrate these possibilities by calling the following function with various prefixes:
(defun display-prefix (arg) "Display the value of the raw prefix arg." (interactive "P") (message "%s" arg))
Here are the results of calling display-prefix with various
raw prefix arguments:
M-x display-prefix -| nil C-u M-x display-prefix -| (4) C-u C-u M-x display-prefix -| (16) C-u 3 M-x display-prefix -| 3 M-3 M-x display-prefix -| 3 ; (Same asC-u 3.) C-u - M-x display-prefix -| - M-- M-x display-prefix -| - ; (Same asC-u -.) C-u - 7 M-x display-prefix -| -7 M-- 7 M-x display-prefix -| -7 ; (Same asC-u -7.)
Emacs uses two variables to store the prefix argument:
prefix-arg and current-prefix-arg. Commands such as
universal-argument that set up prefix arguments for other
commands store them in prefix-arg. In contrast,
current-prefix-arg conveys the prefix argument to the current
command, so setting it has no effect on the prefix arguments for future
commands.
Normally, commands specify which representation to use for the prefix
argument, either numeric or raw, in the interactive specification.
(See section Using interactive.) Alternatively, functions may look at the
value of the prefix argument directly in the variable
current-prefix-arg, but this is less clean.
This function returns the numeric meaning of a valid raw prefix argument
value, arg. The argument may be a symbol, a number, or a list.
If it is nil, the value 1 is returned; if it is -, the
value -1 is returned; if it is a number, that number is returned;
if it is a list, the CAR of that list (which should be a number) is
returned.
This variable holds the raw prefix argument for the current
command. Commands may examine it directly, but the usual method for
accessing it is with (interactive "P").
The value of this variable is the raw prefix argument for the
next editing command. Commands such as universal-argument
that specify prefix arguments for the following command work by setting
this variable.
The raw prefix argument value used by the previous command.
The following commands exist to set up prefix arguments for the following command. Do not call them for any other reason.
This command reads input and specifies a prefix argument for the following command. Don’t call this command yourself unless you know what you are doing.
This command adds to the prefix argument for the following command. The argument arg is the raw prefix argument as it was before this command; it is used to compute the updated prefix argument. Don’t call this command yourself unless you know what you are doing.
This command adds to the numeric argument for the next command. The argument arg is the raw prefix argument as it was before this command; its value is negated to form the new prefix argument. Don’t call this command yourself unless you know what you are doing.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The Emacs command loop is entered automatically when Emacs starts up. This top-level invocation of the command loop never exits; it keeps running as long as Emacs does. Lisp programs can also invoke the command loop. Since this makes more than one activation of the command loop, we call it recursive editing. A recursive editing level has the effect of suspending whatever command invoked it and permitting the user to do arbitrary editing before resuming that command.
The commands available during recursive editing are the same ones available in the top-level editing loop and defined in the keymaps. Only a few special commands exit the recursive editing level; the others return to the recursive editing level when they finish. (The special commands for exiting are always available, but they do nothing when recursive editing is not in progress.)
All command loops, including recursive ones, set up all-purpose error handlers so that an error in a command run from the command loop will not exit the loop.
Minibuffer input is a special kind of recursive editing. It has a few special wrinkles, such as enabling display of the minibuffer and the minibuffer window, but fewer than you might suppose. Certain keys behave differently in the minibuffer, but that is only because of the minibuffer’s local map; if you switch windows, you get the usual Emacs commands.
To invoke a recursive editing level, call the function
recursive-edit. This function contains the command loop; it also
contains a call to catch with tag exit, which makes it
possible to exit the recursive editing level by throwing to exit
(see section Explicit Nonlocal Exits: catch and throw). If you throw a value other than t,
then recursive-edit returns normally to the function that called
it. The command C-M-c (exit-recursive-edit) does this.
Throwing a t value causes recursive-edit to quit, so that
control returns to the command loop one level up. This is called
aborting, and is done by C-] (abort-recursive-edit).
Most applications should not use recursive editing, except as part of using the minibuffer. Usually it is more convenient for the user if you change the major mode of the current buffer temporarily to a special major mode, which should have a command to go back to the previous mode. (The e command in Rmail uses this technique.) Or, if you wish to give the user different text to edit “recursively”, create and select a new buffer in a special mode. In this mode, define a command to complete the processing and go back to the previous buffer. (The m command in Rmail does this.)
Recursive edits are useful in debugging. You can insert a call to
debug into a function definition as a sort of breakpoint, so that
you can look around when the function gets there. debug invokes
a recursive edit but also provides the other features of the debugger.
Recursive editing levels are also used when you type C-r in
query-replace or use C-x q (kbd-macro-query).
This function invokes the editor command loop. It is called automatically by the initialization of Emacs, to let the user begin editing. When called from a Lisp program, it enters a recursive editing level.
If the current buffer is not the same as the selected window’s buffer,
recursive-edit saves and restores the current buffer. Otherwise,
if you switch buffers, the buffer you switched to is current after
recursive-edit returns.
In the following example, the function simple-rec first
advances point one word, then enters a recursive edit, printing out a
message in the echo area. The user can then do any editing desired, and
then type C-M-c to exit and continue executing simple-rec.
(defun simple-rec ()
(forward-word 1)
(message "Recursive edit in progress")
(recursive-edit)
(forward-word 1))
⇒ simple-rec
(simple-rec)
⇒ nil
This function exits from the innermost recursive edit (including
minibuffer input). Its definition is effectively (throw 'exit
nil).
This function aborts the command that requested the innermost recursive
edit (including minibuffer input), by signaling quit
after exiting the recursive edit. Its definition is effectively
(throw 'exit t). See section Quitting.
This function exits all recursive editing levels; it does not return a value, as it jumps completely out of any computation directly back to the main command loop.
This function returns the current depth of recursive edits. When no recursive edit is active, it returns 0.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Disabling a command marks the command as requiring user confirmation before it can be executed. Disabling is used for commands which might be confusing to beginning users, to prevent them from using the commands by accident.
The low-level mechanism for disabling a command is to put a
non-nil disabled property on the Lisp symbol for the
command. These properties are normally set up by the user’s
init file (see section The Init File) with Lisp expressions such as this:
(put 'upcase-region 'disabled t)
For a few commands, these properties are present by default (you can remove them in your init file if you wish).
If the value of the disabled property is a string, the message
saying the command is disabled includes that string. For example:
(put 'delete-region 'disabled
"Text deleted this way cannot be yanked back!\n")
See Disabling in The GNU Emacs Manual, for the details on what happens when a disabled command is invoked interactively. Disabling a command has no effect on calling it as a function from Lisp programs.
Allow command (a symbol) to be executed without special confirmation from now on, and alter the user’s init file (see section The Init File) so that this will apply to future sessions.
Require special confirmation to execute command from now on, and alter the user’s init file so that this will apply to future sessions.
The value of this variable should be a function. When the user
invokes a disabled command interactively, this function is called
instead of the disabled command. It can use this-command-keys
to determine what the user typed to run the command, and thus find the
command itself.
The value may also be nil. Then all commands work normally,
even disabled ones.
By default, the value is a function that asks the user whether to proceed.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The command loop keeps a history of the complex commands that have
been executed, to make it convenient to repeat these commands. A
complex command is one for which the interactive argument reading
uses the minibuffer. This includes any M-x command, any
M-: command, and any command whose interactive
specification reads an argument from the minibuffer. Explicit use of
the minibuffer during the execution of the command itself does not cause
the command to be considered complex.
This variable’s value is a list of recent complex commands, each represented as a form to evaluate. It continues to accumulate all complex commands for the duration of the editing session, but when it reaches the maximum size (see section Minibuffer History), the oldest elements are deleted as new ones are added.
command-history
⇒ ((switch-to-buffer "chistory.texi")
(describe-key "^X^[")
(visit-tags-table "~/emacs/src/")
(find-tag "repeat-complex-command"))
This history list is actually a special case of minibuffer history (see section Minibuffer History), with one special twist: the elements are expressions rather than strings.
There are a number of commands devoted to the editing and recall of
previous commands. The commands repeat-complex-command, and
list-command-history are described in the user manual
(see Repetition in The GNU Emacs Manual). Within the
minibuffer, the usual minibuffer history commands are available.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A keyboard macro is a canned sequence of input events that can be considered a command and made the definition of a key. The Lisp representation of a keyboard macro is a string or vector containing the events. Don’t confuse keyboard macros with Lisp macros (see section Macros).
This function executes kbdmacro as a sequence of events. If kbdmacro is a string or vector, then the events in it are executed exactly as if they had been input by the user. The sequence is not expected to be a single key sequence; normally a keyboard macro definition consists of several key sequences concatenated.
If kbdmacro is a symbol, then its function definition is used in place of kbdmacro. If that is another symbol, this process repeats. Eventually the result should be a string or vector. If the result is not a symbol, string, or vector, an error is signaled.
The argument count is a repeat count; kbdmacro is executed that
many times. If count is omitted or nil, kbdmacro is
executed once. If it is 0, kbdmacro is executed over and over until it
encounters an error or a failing search.
If loopfunc is non-nil, it is a function that is called,
without arguments, prior to each iteration of the macro. If
loopfunc returns nil, then this stops execution of the macro.
See section Reading One Event, for an example of using execute-kbd-macro.
This variable contains the string or vector that defines the keyboard
macro that is currently executing. It is nil if no macro is
currently executing. A command can test this variable so as to behave
differently when run from an executing macro. Do not set this variable
yourself.
This variable is non-nil if and only if a keyboard macro is
being defined. A command can test this variable so as to behave
differently while a macro is being defined. The value is
append while appending to the definition of an existing macro.
The commands start-kbd-macro, kmacro-start-macro and
end-kbd-macro set this variable—do not set it yourself.
The variable is always local to the current terminal and cannot be buffer-local. See section Multiple Terminals.
This variable is the definition of the most recently defined keyboard
macro. Its value is a string or vector, or nil.
The variable is always local to the current terminal and cannot be buffer-local. See section Multiple Terminals.
This normal hook is run when a keyboard macro terminates, regardless of what caused it to terminate (reaching the macro end or an error which ended the macro prematurely).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The command bindings of input events are recorded in data structures called keymaps. Each entry in a keymap associates (or binds) an individual event type, either to another keymap or to a command. When an event type is bound to a keymap, that keymap is used to look up the next input event; this continues until a command is found. The whole process is called key lookup.
| 21.1 Key Sequences | Key sequences as Lisp objects. | |
| 21.2 Keymap Basics | Basic concepts of keymaps. | |
| 21.3 Format of Keymaps | What a keymap looks like as a Lisp object. | |
| 21.4 Creating Keymaps | Functions to create and copy keymaps. | |
| 21.5 Inheritance and Keymaps | How one keymap can inherit the bindings of another keymap. | |
| 21.6 Prefix Keys | Defining a key with a keymap as its definition. | |
| 21.7 Active Keymaps | How Emacs searches the active keymaps for a key binding. | |
| 21.8 Searching the Active Keymaps | A pseudo-Lisp summary of searching active maps. | |
| 21.9 Controlling the Active Keymaps | Each buffer has a local keymap to override the standard (global) bindings. A minor mode can also override them. | |
| 21.10 Key Lookup | Finding a key’s binding in one keymap. | |
| 21.11 Functions for Key Lookup | How to request key lookup. | |
| 21.12 Changing Key Bindings | Redefining a key in a keymap. | |
| 21.13 Remapping Commands | A keymap can translate one command to another. | |
| 21.14 Keymaps for Translating Sequences of Events | Keymaps for translating sequences of events. | |
| 21.15 Commands for Binding Keys | Interactive interfaces for redefining keys. | |
| 21.16 Scanning Keymaps | Looking through all keymaps, for printing help. | |
| 21.17 Menu Keymaps | Defining a menu as a keymap. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A key sequence, or key for short, is a sequence of one
or more input events that form a unit. Input events include
characters, function keys, mouse actions, or system events external to
Emacs, such as iconify-frame (see section Input Events).
The Emacs Lisp representation for a key sequence is a string or
vector. Unless otherwise stated, any Emacs Lisp function that accepts
a key sequence as an argument can handle both representations.
In the string representation, alphanumeric characters ordinarily
stand for themselves; for example, "a" represents a
and "2" represents 2. Control character events are
prefixed by the substring "\C-", and meta characters by
"\M-"; for example, "\C-x" represents the key C-x.
In addition, the TAB, RET, ESC, and DEL events
are represented by "\t", "\r", "\e", and
"\d" respectively. The string representation of a complete key
sequence is the concatenation of the string representations of the
constituent events; thus, "\C-xl" represents the key sequence
C-x l.
Key sequences containing function keys, mouse button events, system events, or non-ASCII characters such as C-= or H-a cannot be represented as strings; they have to be represented as vectors.
In the vector representation, each element of the vector represents
an input event, in its Lisp form. See section Input Events. For example,
the vector [?\C-x ?l] represents the key sequence C-x l.
For examples of key sequences written in string and vector representations, Init Rebinding in The GNU Emacs Manual.
This function converts the text keyseq-text (a string constant)
into a key sequence (a string or vector constant). The contents of
keyseq-text should use the same syntax as in the buffer invoked
by the C-x C-k RET (kmacro-edit-macro) command; in
particular, you must surround function key names with
‘<…>’. See Edit Keyboard Macro in The GNU Emacs
Manual.
(kbd "C-x") ⇒ "\C-x" (kbd "C-x C-f") ⇒ "\C-x\C-f" (kbd "C-x 4 C-f") ⇒ "\C-x4\C-f" (kbd "X") ⇒ "X" (kbd "RET") ⇒ "\^M" (kbd "C-c SPC") ⇒ "\C-c " (kbd "<f1> SPC") ⇒ [f1 32] (kbd "C-M-<down>") ⇒ [C-M-down]
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A keymap is a Lisp data structure that specifies key bindings for various key sequences.
A single keymap directly specifies definitions for individual events. When a key sequence consists of a single event, its binding in a keymap is the keymap’s definition for that event. The binding of a longer key sequence is found by an iterative process: first find the definition of the first event (which must itself be a keymap); then find the second event’s definition in that keymap, and so on until all the events in the key sequence have been processed.
If the binding of a key sequence is a keymap, we call the key sequence
a prefix key. Otherwise, we call it a complete key (because
no more events can be added to it). If the binding is nil,
we call the key undefined. Examples of prefix keys are C-c,
C-x, and C-x 4. Examples of defined complete keys are
X, RET, and C-x 4 C-f. Examples of undefined complete
keys are C-x C-g, and C-c 3. See section Prefix Keys, for more
details.
The rule for finding the binding of a key sequence assumes that the intermediate bindings (found for the events before the last) are all keymaps; if this is not so, the sequence of events does not form a unit—it is not really one key sequence. In other words, removing one or more events from the end of any valid key sequence must always yield a prefix key. For example, C-f C-n is not a key sequence; C-f is not a prefix key, so a longer sequence starting with C-f cannot be a key sequence.
The set of possible multi-event key sequences depends on the bindings for prefix keys; therefore, it can be different for different keymaps, and can change when bindings are changed. However, a one-event sequence is always a key sequence, because it does not depend on any prefix keys for its well-formedness.
At any time, several primary keymaps are active—that is, in use for finding key bindings. These are the global map, which is shared by all buffers; the local keymap, which is usually associated with a specific major mode; and zero or more minor mode keymaps, which belong to currently enabled minor modes. (Not all minor modes have keymaps.) The local keymap bindings shadow (i.e., take precedence over) the corresponding global bindings. The minor mode keymaps shadow both local and global keymaps. See section Active Keymaps, for details.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Each keymap is a list whose CAR is the symbol keymap. The
remaining elements of the list define the key bindings of the keymap.
A symbol whose function definition is a keymap is also a keymap. Use
the function keymapp (see below) to test whether an object is a
keymap.
Several kinds of elements may appear in a keymap, after the symbol
keymap that begins it:
(type . binding)This specifies one binding, for events of type type. Each ordinary binding applies to events of a particular event type, which is always a character or a symbol. See section Classifying Events. In this kind of binding, binding is a command.
(type item-name . binding)This specifies a binding which is also a simple menu item that displays as item-name in the menu. See section Simple Menu Items.
(type item-name help-string . binding)This is a simple menu item with help string help-string.
(type menu-item . details)This specifies a binding which is also an extended menu item. This allows use of other features. See section Extended Menu Items.
(t . binding)This specifies a default key binding; any event not bound by other
elements of the keymap is given binding as its binding. Default
bindings allow a keymap to bind all possible event types without having
to enumerate all of them. A keymap that has a default binding
completely masks any lower-precedence keymap, except for events
explicitly bound to nil (see below).
char-tableIf an element of a keymap is a char-table, it counts as holding bindings for all character events with no modifier bits (see modifier bits): element n is the binding for the character with code n. This is a compact way to record lots of bindings. A keymap with such a char-table is called a full keymap. Other keymaps are called sparse keymaps.
stringAside from elements that specify bindings for keys, a keymap can also have a string as an element. This is called the overall prompt string and makes it possible to use the keymap as a menu. See section Defining Menus.
(keymap …)If an element of a keymap is itself a keymap, it counts as if this inner keymap
were inlined in the outer keymap. This is used for multiple-inheritance, such
as in make-composed-keymap.
When the binding is nil, it doesn’t constitute a definition
but it does take precedence over a default binding or a binding in the
parent keymap. On the other hand, a binding of nil does
not override lower-precedence keymaps; thus, if the local map
gives a binding of nil, Emacs uses the binding from the
global map.
Keymaps do not directly record bindings for the meta characters.
Instead, meta characters are regarded for purposes of key lookup as
sequences of two characters, the first of which is ESC (or
whatever is currently the value of meta-prefix-char). Thus, the
key M-a is internally represented as ESC a, and its
global binding is found at the slot for a in esc-map
(see section Prefix Keys).
This conversion applies only to characters, not to function keys or other input events; thus, M-end has nothing to do with ESC end.
Here as an example is the local keymap for Lisp mode, a sparse keymap. It defines bindings for DEL, C-c C-z, C-M-q, and C-M-x (the actual value also contains a menu binding, which is omitted here for the sake of brevity).
lisp-mode-map ⇒
(keymap
(3 keymap
;; C-c C-z
(26 . run-lisp))
(27 keymap
;; C-M-x, treated as ESC C-x
(24 . lisp-send-defun))
;; This part is inherited from lisp-mode-shared-map.
keymap
;; DEL
(127 . backward-delete-char-untabify)
(27 keymap
;; C-M-q, treated as ESC C-q
(17 . indent-sexp)))
This function returns t if object is a keymap, nil
otherwise. More precisely, this function tests for a list whose
CAR is keymap, or for a symbol whose function definition
satisfies keymapp.
(keymapp '(keymap))
⇒ t
(fset 'foo '(keymap))
(keymapp 'foo)
⇒ t
(keymapp (current-global-map))
⇒ t
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here we describe the functions for creating keymaps.
This function creates and returns a new sparse keymap with no entries.
(A sparse keymap is the kind of keymap you usually want.) The new
keymap does not contain a char-table, unlike make-keymap, and
does not bind any events.
(make-sparse-keymap)
⇒ (keymap)
If you specify prompt, that becomes the overall prompt string for the keymap. You should specify this only for menu keymaps (see section Defining Menus). A keymap with an overall prompt string will always present a mouse menu or a keyboard menu if it is active for looking up the next input event. Don’t specify an overall prompt string for the main map of a major or minor mode, because that would cause the command loop to present a keyboard menu every time.
This function creates and returns a new full keymap. That keymap
contains a char-table (see section Char-Tables) with slots for all
characters without modifiers. The new keymap initially binds all
these characters to nil, and does not bind any other kind of
event. The argument prompt specifies a
prompt string, as in make-sparse-keymap.
(make-keymap)
⇒ (keymap #^[nil nil keymap nil nil nil …])
A full keymap is more efficient than a sparse keymap when it holds lots of bindings; for just a few, the sparse keymap is better.
This function returns a copy of keymap. Any keymaps that appear directly as bindings in keymap are also copied recursively, and so on to any number of levels. However, recursive copying does not take place when the definition of a character is a symbol whose function definition is a keymap; the same symbol appears in the new copy.
(setq map (copy-keymap (current-local-map))) ⇒ (keymap
;; (This implements meta characters.)
(27 keymap
(83 . center-paragraph)
(115 . center-line))
(9 . tab-to-tab-stop))
(eq map (current-local-map))
⇒ nil
(equal map (current-local-map))
⇒ t
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A keymap can inherit the bindings of another keymap, which we call the parent keymap. Such a keymap looks like this:
(keymap elements… . parent-keymap)
The effect is that this keymap inherits all the bindings of parent-keymap, whatever they may be at the time a key is looked up, but can add to them or override them with elements.
If you change the bindings in parent-keymap using
define-key or other key-binding functions, these changed
bindings are visible in the inheriting keymap, unless shadowed by the
bindings made by elements. The converse is not true: if you use
define-key to change bindings in the inheriting keymap, these
changes are recorded in elements, but have no effect on
parent-keymap.
The proper way to construct a keymap with a parent is to use
set-keymap-parent; if you have code that directly constructs a
keymap with a parent, please convert the program to use
set-keymap-parent instead.
This returns the parent keymap of keymap. If keymap
has no parent, keymap-parent returns nil.
This sets the parent keymap of keymap to parent, and returns
parent. If parent is nil, this function gives
keymap no parent at all.
If keymap has submaps (bindings for prefix keys), they too receive new parent keymaps that reflect what parent specifies for those prefix keys.
Here is an example showing how to make a keymap that inherits
from text-mode-map:
(let ((map (make-sparse-keymap))) (set-keymap-parent map text-mode-map) map)
A non-sparse keymap can have a parent too, but this is not very
useful. A non-sparse keymap always specifies something as the binding
for every numeric character code without modifier bits, even if it is
nil, so these character’s bindings are never inherited from
the parent keymap.
Sometimes you want to make a keymap that inherits from more than one
map. You can use the function make-composed-keymap for this.
This function returns a new keymap composed of the existing keymap(s)
maps, and optionally inheriting from a parent keymap
parent. maps can be a single keymap or a list of more
than one. When looking up a key in the resulting new map, Emacs
searches in each of the maps in turn, and then in parent,
stopping at the first match. A nil binding in any one of
maps overrides any binding in parent, but it does not
override any non-nil binding in any other of the maps.
For example, here is how Emacs sets the parent of
help-mode-map, such that it inherits from both
button-buffer-map and special-mode-map:
(defvar help-mode-map
(let ((map (make-sparse-keymap)))
(set-keymap-parent map
(make-composed-keymap button-buffer-map special-mode-map))
... map) ... )
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A prefix key is a key sequence whose binding is a keymap. The
keymap defines what to do with key sequences that extend the prefix key.
For example, C-x is a prefix key, and it uses a keymap that is
also stored in the variable ctl-x-map. This keymap defines
bindings for key sequences starting with C-x.
Some of the standard Emacs prefix keys use keymaps that are also found in Lisp variables:
esc-map is the global keymap for the ESC prefix key. Thus,
the global definitions of all meta characters are actually found here.
This map is also the function definition of ESC-prefix.
help-map is the global keymap for the C-h prefix key.
mode-specific-map is the global keymap for the prefix key
C-c. This map is actually global, not mode-specific, but its name
provides useful information about C-c in the output of C-h b
(display-bindings), since the main use of this prefix key is for
mode-specific bindings.
ctl-x-map is the global keymap used for the C-x prefix key.
This map is found via the function cell of the symbol
Control-X-prefix.
mule-keymap is the global keymap used for the C-x RET
prefix key.
ctl-x-4-map is the global keymap used for the C-x 4 prefix
key.
ctl-x-5-map is the global keymap used for the C-x 5 prefix
key.
2C-mode-map is the global keymap used for the C-x 6 prefix
key.
vc-prefix-map is the global keymap used for the C-x v prefix
key.
goto-map is the global keymap used for the M-g prefix
key.
search-map is the global keymap used for the M-s prefix
key.
facemenu-keymap is the global keymap used for the M-o
prefix key.
The keymap binding of a prefix key is used for looking up the event
that follows the prefix key. (It may instead be a symbol whose function
definition is a keymap. The effect is the same, but the symbol serves
as a name for the prefix key.) Thus, the binding of C-x is the
symbol Control-X-prefix, whose function cell holds the keymap
for C-x commands. (The same keymap is also the value of
ctl-x-map.)
Prefix key definitions can appear in any active keymap. The definitions of C-c, C-x, C-h and ESC as prefix keys appear in the global map, so these prefix keys are always available. Major and minor modes can redefine a key as a prefix by putting a prefix key definition for it in the local map or the minor mode’s map. See section Active Keymaps.
If a key is defined as a prefix in more than one active map, then its various definitions are in effect merged: the commands defined in the minor mode keymaps come first, followed by those in the local map’s prefix definition, and then by those from the global map.
In the following example, we make C-p a prefix key in the local
keymap, in such a way that C-p is identical to C-x. Then
the binding for C-p C-f is the function find-file, just
like C-x C-f. The key sequence C-p 6 is not found in any
active keymap.
(use-local-map (make-sparse-keymap))
⇒ nil
(local-set-key "\C-p" ctl-x-map)
⇒ nil
(key-binding "\C-p\C-f")
⇒ find-file
(key-binding "\C-p6")
⇒ nil
This function prepares symbol for use as a prefix key’s binding:
it creates a sparse keymap and stores it as symbol’s function
definition. Subsequently binding a key sequence to symbol will
make that key sequence into a prefix key. The return value is symbol.
This function also sets symbol as a variable, with the keymap as
its value. But if mapvar is non-nil, it sets mapvar
as a variable instead.
If prompt is non-nil, that becomes the overall prompt
string for the keymap. The prompt string should be given for menu keymaps
(see section Defining Menus).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs contains many keymaps, but at any time only a few keymaps are active. When Emacs receives user input, it translates the input event (see section Keymaps for Translating Sequences of Events), and looks for a key binding in the active keymaps.
Usually, the active keymaps are: (i) the keymap specified by the
keymap property, (ii) the keymaps of enabled minor modes, (iii)
the current buffer’s local keymap, and (iv) the global keymap, in that
order. Emacs searches for each input key sequence in all these
keymaps.
Of these “usual” keymaps, the highest-precedence one is specified
by the keymap text or overlay property at point, if any. (For
a mouse input event, Emacs uses the event position instead of point;
see section Searching the Active Keymaps.)
Next in precedence are keymaps specified by enabled minor modes.
These keymaps, if any, are specified by the variables
emulation-mode-map-alists,
minor-mode-overriding-map-alist, and
minor-mode-map-alist. See section Controlling the Active Keymaps.
Next in precedence is the buffer’s local keymap, containing
key bindings specific to the buffer. The minibuffer also has a local
keymap (see section Introduction to Minibuffers). If there is a local-map
text or overlay property at point, that specifies the local keymap to
use, in place of the buffer’s default local keymap.
The local keymap is normally set by the buffer’s major mode, and
every buffer with the same major mode shares the same local keymap.
Hence, if you call local-set-key (see section Commands for Binding Keys)
to change the local keymap in one buffer, that also affects the local
keymaps in other buffers with the same major mode.
Finally, the global keymap contains key bindings that are
defined regardless of the current buffer, such as C-f. It is
always active, and is bound to the variable global-map.
Apart from the above “usual” keymaps, Emacs provides special ways
for programs to make other keymaps active. Firstly, the variable
overriding-local-map specifies a keymap that replaces the usual
active keymaps, except for the global keymap. Secondly, the
terminal-local variable overriding-terminal-local-map specifies
a keymap that takes precedence over all other keymaps
(including overriding-local-map); this is normally used for
modal/transient keybindings (the function set-transient-map
provides a convenient interface for this). See section Controlling the Active Keymaps, for details.
Making keymaps active is not the only way to use them. Keymaps are
also used in other ways, such as for translating events within
read-key-sequence. See section Keymaps for Translating Sequences of Events.
See section Standard Keymaps, for a list of some standard keymaps.
This returns the list of active keymaps that would be used by the
command loop in the current circumstances to look up a key sequence.
Normally it ignores overriding-local-map and
overriding-terminal-local-map, but if olp is non-nil
then it pays attention to them. position can optionally be either
an event position as returned by event-start or a buffer
position, and may change the keymaps as described for
key-binding.
This function returns the binding for key according to the
current active keymaps. The result is nil if key is
undefined in the keymaps.
The argument accept-defaults controls checking for default
bindings, as in lookup-key (see section Functions for Key Lookup).
When commands are remapped (see section Remapping Commands),
key-binding normally processes command remappings so as to
return the remapped command that will actually be executed. However,
if no-remap is non-nil, key-binding ignores
remappings and returns the binding directly specified for key.
If key starts with a mouse event (perhaps following a prefix
event), the maps to be consulted are determined based on the event’s
position. Otherwise, they are determined based on the value of point.
However, you can override either of them by specifying position.
If position is non-nil, it should be either a buffer
position or an event position like the value of event-start.
Then the maps consulted are determined based on position.
Emacs signals an error if key is not a string or a vector.
(key-binding "\C-x\C-f")
⇒ find-file
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here is a pseudo-Lisp summary of how Emacs searches the active keymaps:
(or (if overriding-terminal-local-map
(find-in overriding-terminal-local-map))
(if overriding-local-map
(find-in overriding-local-map)
(or (find-in (get-char-property (point) 'keymap))
(find-in-any emulation-mode-map-alists)
(find-in-any minor-mode-overriding-map-alist)
(find-in-any minor-mode-map-alist)
(if (get-text-property (point) 'local-map)
(find-in (get-char-property (point) 'local-map))
(find-in (current-local-map)))))
(find-in (current-global-map)))
Here, find-in and find-in-any are pseudo functions that
search in one keymap and in an alist of keymaps, respectively. Note
that the set-transient-map function works by setting
overriding-terminal-local-map (see section Controlling the Active Keymaps).
In the above pseudo-code, if a key sequence starts with a mouse
event (see section Mouse Events), that event’s position is used instead of
point, and the event’s buffer is used instead of the current buffer.
In particular, this affects how the keymap and local-map
properties are looked up. If a mouse event occurs on a string
embedded with a display, before-string, or
after-string property (see section Properties with Special Meanings), and the
string has a non-nil keymap or local-map
property, that overrides the corresponding property in the underlying
buffer text (i.e., the property specified by the underlying text is
ignored).
When a key binding is found in one of the active keymaps, and that binding is a command, the search is over—the command is executed. However, if the binding is a symbol with a value or a string, Emacs replaces the input key sequences with the variable’s value or the string, and restarts the search of the active keymaps. See section Key Lookup.
The command which is finally found might also be remapped. See section Remapping Commands.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This variable contains the default global keymap that maps Emacs
keyboard input to commands. The global keymap is normally this
keymap. The default global keymap is a full keymap that binds
self-insert-command to all of the printing characters.
It is normal practice to change the bindings in the global keymap, but you should not assign this variable any value other than the keymap it starts out with.
This function returns the current global keymap. This is the same as
the value of global-map unless you change one or the other.
The return value is a reference, not a copy; if you use
define-key or other functions on it you will alter global
bindings.
(current-global-map)
⇒ (keymap [set-mark-command beginning-of-line …
delete-backward-char])
This function returns the current buffer’s local keymap, or nil
if it has none. In the following example, the keymap for the
*scratch* buffer (using Lisp Interaction mode) is a sparse keymap
in which the entry for ESC, ASCII code 27, is another sparse
keymap.
(current-local-map)
⇒ (keymap
(10 . eval-print-last-sexp)
(9 . lisp-indent-line)
(127 . backward-delete-char-untabify)
(27 keymap
(24 . eval-defun)
(17 . indent-sexp)))
current-local-map returns a reference to the local keymap, not
a copy of it; if you use define-key or other functions on it
you will alter local bindings.
This function returns a list of the keymaps of currently enabled minor modes.
This function makes keymap the new current global keymap. It
returns nil.
It is very unusual to change the global keymap.
This function makes keymap the new local keymap of the current
buffer. If keymap is nil, then the buffer has no local
keymap. use-local-map returns nil. Most major mode
commands use this function.
This variable is an alist describing keymaps that may or may not be active according to the values of certain variables. Its elements look like this:
(variable . keymap)
The keymap keymap is active whenever variable has a
non-nil value. Typically variable is the variable that
enables or disables a minor mode. See section Keymaps and Minor Modes.
Note that elements of minor-mode-map-alist do not have the same
structure as elements of minor-mode-alist. The map must be the
CDR of the element; a list with the map as the second element will
not do. The CDR can be either a keymap (a list) or a symbol whose
function definition is a keymap.
When more than one minor mode keymap is active, the earlier one in
minor-mode-map-alist takes priority. But you should design
minor modes so that they don’t interfere with each other. If you do
this properly, the order will not matter.
See Keymaps and Minor Modes, for more information about minor
modes. See also minor-mode-key-binding (see section Functions for Key Lookup).
This variable allows major modes to override the key bindings for
particular minor modes. The elements of this alist look like the
elements of minor-mode-map-alist: (variable
. keymap).
If a variable appears as an element of
minor-mode-overriding-map-alist, the map specified by that
element totally replaces any map specified for the same variable in
minor-mode-map-alist.
minor-mode-overriding-map-alist is automatically buffer-local in
all buffers.
If non-nil, this variable holds a keymap to use instead of the
buffer’s local keymap, any text property or overlay keymaps, and any
minor mode keymaps. This keymap, if specified, overrides all other
maps that would have been active, except for the current global map.
If non-nil, this variable holds a keymap to use instead of
overriding-local-map, the buffer’s local keymap, text property
or overlay keymaps, and all the minor mode keymaps.
This variable is always local to the current terminal and cannot be buffer-local. See section Multiple Terminals. It is used to implement incremental search mode.
If this variable is non-nil, the value of
overriding-local-map or overriding-terminal-local-map can
affect the display of the menu bar. The default value is nil, so
those map variables have no effect on the menu bar.
Note that these two map variables do affect the execution of key sequences entered using the menu bar, even if they do not affect the menu bar display. So if a menu bar key sequence comes in, you should clear the variables before looking up and executing that key sequence. Modes that use the variables would typically do this anyway; normally they respond to events that they do not handle by “unreading” them and exiting.
This variable holds a keymap for special events. If an event type has a
binding in this keymap, then it is special, and the binding for the
event is run directly by read-event. See section Special Events.
This variable holds a list of keymap alists to use for emulation
modes. It is intended for modes or packages using multiple minor-mode
keymaps. Each element is a keymap alist which has the same format and
meaning as minor-mode-map-alist, or a symbol with a variable
binding which is such an alist. The “active” keymaps in each alist
are used before minor-mode-map-alist and
minor-mode-overriding-map-alist.
This function adds keymap as a transient keymap, which takes precedence over other keymaps for one (or more) subsequent keys.
Normally, keymap is used just once, to look up the very next
key. If the optional argument pred is t, the map stays
active as long as the user types keys defined in keymap; when
the user types a key that is not in keymap, the transient keymap
is deactivated and normal key lookup continues for that key.
The pred argument can also be a function. In that case, the
function is called with no arguments, prior to running each command,
while keymap is active; it should return non-nil if
keymap should stay active.
This function works by adding and removing keymap from the
variable overriding-terminal-local-map, which takes precedence
over all other active keymaps (see section Searching the Active Keymaps).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Key lookup is the process of finding the binding of a key sequence from a given keymap. The execution or use of the binding is not part of key lookup.
Key lookup uses just the event type of each event in the key sequence;
the rest of the event is ignored. In fact, a key sequence used for key
lookup may designate a mouse event with just its types (a symbol)
instead of the entire event (a list). See section Input Events. Such
a “key sequence” is insufficient for command-execute to run,
but it is sufficient for looking up or rebinding a key.
When the key sequence consists of multiple events, key lookup processes the events sequentially: the binding of the first event is found, and must be a keymap; then the second event’s binding is found in that keymap, and so on until all the events in the key sequence are used up. (The binding thus found for the last event may or may not be a keymap.) Thus, the process of key lookup is defined in terms of a simpler process for looking up a single event in a keymap. How that is done depends on the type of object associated with the event in that keymap.
Let’s use the term keymap entry to describe the value found by
looking up an event type in a keymap. (This doesn’t include the item
string and other extra elements in a keymap element for a menu item, because
lookup-key and other key lookup functions don’t include them in
the returned value.) While any Lisp object may be stored in a keymap
as a keymap entry, not all make sense for key lookup. Here is a table
of the meaningful types of keymap entries:
nilnil means that the events used so far in the lookup form an
undefined key. When a keymap fails to mention an event type at all, and
has no default binding, that is equivalent to a binding of nil
for that event type.
The events used so far in the lookup form a complete key, and command is its binding. See section What Is a Function?.
The array (either a string or a vector) is a keyboard macro. The events used so far in the lookup form a complete key, and the array is its binding. See Keyboard Macros, for more information.
The events used so far in the lookup form a prefix key. The next event of the key sequence is looked up in keymap.
The meaning of a list depends on what it contains:
keymap, then the list
is a keymap, and is treated as a keymap (see above).
lambda, then the list is a
lambda expression. This is presumed to be a function, and is treated
as such (see above). In order to execute properly as a key binding,
this function must be a command—it must have an interactive
specification. See section Defining Commands.
(othermap . othertype)
When key lookup encounters an indirect entry, it looks up instead the binding of othertype in othermap and uses that.
This feature permits you to define one key as an alias for another key.
For example, an entry whose CAR is the keymap called esc-map
and whose CDR is 32 (the code for SPC) means, “Use the global
binding of Meta-SPC, whatever that may be”.
The function definition of symbol is used in place of symbol. If that too is a symbol, then this process is repeated, any number of times. Ultimately this should lead to an object that is a keymap, a command, or a keyboard macro. A list is allowed if it is a keymap or a command, but indirect entries are not understood when found via symbols.
Note that keymaps and keyboard macros (strings and vectors) are not
valid functions, so a symbol with a keymap, string, or vector as its
function definition is invalid as a function. It is, however, valid as
a key binding. If the definition is a keyboard macro, then the symbol
is also valid as an argument to command-execute
(see section Interactive Call).
The symbol undefined is worth special mention: it means to treat
the key as undefined. Strictly speaking, the key is defined, and its
binding is the command undefined; but that command does the same
thing that is done automatically for an undefined key: it rings the bell
(by calling ding) but does not signal an error.
undefined is used in local keymaps to override a global key
binding and make the key “undefined” locally. A local binding of
nil would fail to do this because it would not override the
global binding.
If any other type of object is found, the events used so far in the lookup form a complete key, and the object is its binding, but the binding is not executable as a command.
In short, a keymap entry may be a keymap, a command, a keyboard
macro, a symbol that leads to one of them, or an indirection or
nil.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here are the functions and variables pertaining to key lookup.
This function returns the definition of key in keymap. All
the other functions described in this chapter that look up keys use
lookup-key. Here are examples:
(lookup-key (current-global-map) "\C-x\C-f")
⇒ find-file
(lookup-key (current-global-map) (kbd "C-x C-f"))
⇒ find-file
(lookup-key (current-global-map) "\C-x\C-f12345")
⇒ 2
If the string or vector key is not a valid key sequence according to the prefix keys specified in keymap, it must be “too long” and have extra events at the end that do not fit into a single key sequence. Then the value is a number, the number of events at the front of key that compose a complete key.
If accept-defaults is non-nil, then lookup-key
considers default bindings as well as bindings for the specific events
in key. Otherwise, lookup-key reports only bindings for
the specific sequence key, ignoring default bindings except when
you explicitly ask about them. (To do this, supply t as an
element of key; see Format of Keymaps.)
If key contains a meta character (not a function key), that
character is implicitly replaced by a two-character sequence: the value
of meta-prefix-char, followed by the corresponding non-meta
character. Thus, the first example below is handled by conversion into
the second example.
(lookup-key (current-global-map) "\M-f")
⇒ forward-word
(lookup-key (current-global-map) "\ef")
⇒ forward-word
Unlike read-key-sequence, this function does not modify the
specified events in ways that discard information (see section Key Sequence Input). In particular, it does not convert letters to lower case and
it does not change drag events to clicks.
Used in keymaps to undefine keys. It calls ding, but does
not cause an error.
This function returns the binding for key in the current
local keymap, or nil if it is undefined there.
The argument accept-defaults controls checking for default bindings,
as in lookup-key (above).
This function returns the binding for command key in the
current global keymap, or nil if it is undefined there.
The argument accept-defaults controls checking for default bindings,
as in lookup-key (above).
This function returns a list of all the active minor mode bindings of
key. More precisely, it returns an alist of pairs
(modename . binding), where modename is the
variable that enables the minor mode, and binding is key’s
binding in that mode. If key has no minor-mode bindings, the
value is nil.
If the first binding found is not a prefix definition (a keymap or a symbol defined as a keymap), all subsequent bindings from other minor modes are omitted, since they would be completely shadowed. Similarly, the list omits non-prefix bindings that follow prefix bindings.
The argument accept-defaults controls checking for default
bindings, as in lookup-key (above).
This variable is the meta-prefix character code. It is used for translating a meta character to a two-character sequence so it can be looked up in a keymap. For useful results, the value should be a prefix event (see section Prefix Keys). The default value is 27, which is the ASCII code for ESC.
As long as the value of meta-prefix-char remains 27, key lookup
translates M-b into ESC b, which is normally defined
as the backward-word command. However, if you were to set
meta-prefix-char to 24, the code for C-x, then Emacs will
translate M-b into C-x b, whose standard binding is the
switch-to-buffer command. (Don’t actually do this!) Here is an
illustration of what would happen:
meta-prefix-char ; The default value.
⇒ 27
(key-binding "\M-b")
⇒ backward-word
?\C-x ; The print representation ⇒ 24 ; of a character.
(setq meta-prefix-char 24)
⇒ 24
(key-binding "\M-b")
⇒ switch-to-buffer ; Now, typing M-b is
; like typing C-x b.
(setq meta-prefix-char 27) ; Avoid confusion!
⇒ 27 ; Restore the default value!
This translation of one event into two happens only for characters, not for other kinds of input events. Thus, M-F1, a function key, is not converted into ESC F1.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The way to rebind a key is to change its entry in a keymap. If you
change a binding in the global keymap, the change is effective in all
buffers (though it has no direct effect in buffers that shadow the
global binding with a local one). If you change the current buffer’s
local map, that usually affects all buffers using the same major mode.
The global-set-key and local-set-key functions are
convenient interfaces for these operations (see section Commands for Binding Keys). You can also use define-key, a more general
function; then you must explicitly specify the map to change.
When choosing the key sequences for Lisp programs to rebind, please follow the Emacs conventions for use of various keys (see section Key Binding Conventions).
In writing the key sequence to rebind, it is good to use the special
escape sequences for control and meta characters (see section String Type).
The syntax ‘\C-’ means that the following character is a control
character and ‘\M-’ means that the following character is a meta
character. Thus, the string "\M-x" is read as containing a
single M-x, "\C-f" is read as containing a single
C-f, and "\M-\C-x" and "\C-\M-x" are both read as
containing a single C-M-x. You can also use this escape syntax in
vectors, as well as others that aren’t allowed in strings; one example
is ‘[?\C-\H-x home]’. See section Character Type.
The key definition and lookup functions accept an alternate syntax for
event types in a key sequence that is a vector: you can use a list
containing modifier names plus one base event (a character or function
key name). For example, (control ?a) is equivalent to
?\C-a and (hyper control left) is equivalent to
C-H-left. One advantage of such lists is that the precise
numeric codes for the modifier bits don’t appear in compiled files.
The functions below signal an error if keymap is not a keymap,
or if key is not a string or vector representing a key sequence.
You can use event types (symbols) as shorthand for events that are
lists. The kbd function (see section Key Sequences) is a
convenient way to specify the key sequence.
This function sets the binding for key in keymap. (If
key is more than one event long, the change is actually made
in another keymap reached from keymap.) The argument
binding can be any Lisp object, but only certain types are
meaningful. (For a list of meaningful types, see Key Lookup.)
The value returned by define-key is binding.
If key is [t], this sets the default binding in
keymap. When an event has no binding of its own, the Emacs
command loop uses the keymap’s default binding, if there is one.
Every prefix of key must be a prefix key (i.e., bound to a keymap)
or undefined; otherwise an error is signaled. If some prefix of
key is undefined, then define-key defines it as a prefix
key so that the rest of key can be defined as specified.
If there was previously no binding for key in keymap, the new binding is added at the beginning of keymap. The order of bindings in a keymap makes no difference for keyboard input, but it does matter for menu keymaps (see section Menu Keymaps).
This example creates a sparse keymap and makes a number of bindings in it:
(setq map (make-sparse-keymap))
⇒ (keymap)
(define-key map "\C-f" 'forward-char)
⇒ forward-char
map
⇒ (keymap (6 . forward-char))
;; Build sparse submap for C-x and bind f in that.
(define-key map (kbd "C-x f") 'forward-word)
⇒ forward-word
map
⇒ (keymap
(24 keymap ; C-x
(102 . forward-word)) ; f
(6 . forward-char)) ; C-f
;; Bind C-p to thectl-x-map. (define-key map (kbd "C-p") ctl-x-map) ;;ctl-x-map⇒ [nil … find-file … backward-kill-sentence]
;; Bind C-f to foo in the ctl-x-map.
(define-key map (kbd "C-p C-f") 'foo)
⇒ 'foo
map
⇒ (keymap ; Note foo in ctl-x-map.
(16 keymap [nil … foo … backward-kill-sentence])
(24 keymap
(102 . forward-word))
(6 . forward-char))
Note that storing a new binding for C-p C-f actually works by
changing an entry in ctl-x-map, and this has the effect of
changing the bindings of both C-p C-f and C-x C-f in the
default global map.
The function substitute-key-definition scans a keymap for
keys that have a certain binding and rebinds them with a different
binding. Another feature which is cleaner and can often produce the
same results to remap one command into another (see section Remapping Commands).
This function replaces olddef with newdef for any keys in
keymap that were bound to olddef. In other words,
olddef is replaced with newdef wherever it appears. The
function returns nil.
For example, this redefines C-x C-f, if you do it in an Emacs with standard bindings:
(substitute-key-definition 'find-file 'find-file-read-only (current-global-map))
If oldmap is non-nil, that changes the behavior of
substitute-key-definition: the bindings in oldmap determine
which keys to rebind. The rebindings still happen in keymap, not
in oldmap. Thus, you can change one map under the control of the
bindings in another. For example,
(substitute-key-definition 'delete-backward-char 'my-funny-delete my-map global-map)
puts the special deletion command in my-map for whichever keys
are globally bound to the standard deletion command.
Here is an example showing a keymap before and after substitution:
(setq map '(keymap
(?1 . olddef-1)
(?2 . olddef-2)
(?3 . olddef-1)))
⇒ (keymap (49 . olddef-1) (50 . olddef-2) (51 . olddef-1))
(substitute-key-definition 'olddef-1 'newdef map) ⇒ nil
map ⇒ (keymap (49 . newdef) (50 . olddef-2) (51 . newdef))
This function changes the contents of the full keymap keymap by
remapping self-insert-command to the command undefined
(see section Remapping Commands). This has the effect of undefining all
printing characters, thus making ordinary insertion of text impossible.
suppress-keymap returns nil.
If nodigits is nil, then suppress-keymap defines
digits to run digit-argument, and - to run
negative-argument. Otherwise it makes them undefined like the
rest of the printing characters.
The suppress-keymap function does not make it impossible to
modify a buffer, as it does not suppress commands such as yank
and quoted-insert. To prevent any modification of a buffer, make
it read-only (see section Read-Only Buffers).
Since this function modifies keymap, you would normally use it
on a newly created keymap. Operating on an existing keymap
that is used for some other purpose is likely to cause trouble; for
example, suppressing global-map would make it impossible to use
most of Emacs.
This function can be used to initialize the local keymap of a major
mode for which insertion of text is not desirable. But usually such a
mode should be derived from special-mode (see section Basic Major Modes); then its keymap will automatically inherit from
special-mode-map, which is already suppressed. Here is how
special-mode-map is defined:
(defvar special-mode-map
(let ((map (make-sparse-keymap)))
(suppress-keymap map)
(define-key map "q" 'quit-window)
…
map))
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A special kind of key binding can be used to remap one command
to another, without having to refer to the key sequence(s) bound to
the original command. To use this feature, make a key binding for a
key sequence that starts with the dummy event remap, followed
by the command name you want to remap; for the binding, specify the
new definition (usually a command name, but possibly any other valid
definition for a key binding).
For example, suppose My mode provides a special command
my-kill-line, which should be invoked instead of
kill-line. To establish this, its mode keymap should contain
the following remapping:
(define-key my-mode-map [remap kill-line] 'my-kill-line)
Then, whenever my-mode-map is active, if the user types
C-k (the default global key sequence for kill-line) Emacs
will instead run my-kill-line.
Note that remapping only takes place through active keymaps; for
example, putting a remapping in a prefix keymap like ctl-x-map
typically has no effect, as such keymaps are not themselves active.
In addition, remapping only works through a single level; in the
following example,
(define-key my-mode-map [remap kill-line] 'my-kill-line) (define-key my-mode-map [remap my-kill-line] 'my-other-kill-line)
kill-line is not remapped to my-other-kill-line.
Instead, if an ordinary key binding specifies kill-line, it is
remapped to my-kill-line; if an ordinary binding specifies
my-kill-line, it is remapped to my-other-kill-line.
To undo the remapping of a command, remap it to nil; e.g.,
(define-key my-mode-map [remap kill-line] nil)
This function returns the remapping for command (a symbol),
given the current active keymaps. If command is not remapped
(which is the usual situation), or not a symbol, the function returns
nil. position can optionally specify a buffer position
or an event position to determine the keymaps to use, as in
key-binding.
If the optional argument keymaps is non-nil, it
specifies a list of keymaps to search in. This argument is ignored if
position is non-nil.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When the read-key-sequence function reads a key sequence
(see section Key Sequence Input), it uses translation keymaps to
translate certain event sequences into others. The translation
keymaps are input-decode-map, local-function-key-map,
and key-translation-map (in order of priority).
Translation keymaps have the same structure as other keymaps, but are used differently: they specify translations to make while reading key sequences, rather than bindings for complete key sequences. As each key sequence is read, it is checked against each translation keymap. If one of the translation keymaps “binds” k to a vector v, then whenever k appears as a sub-sequence anywhere in a key sequence, that sub-sequence is replaced with the events in v.
For example, VT100 terminals send ESC O P when the
keypad key PF1 is pressed. On such terminals, Emacs must
translate that sequence of events into a single event pf1.
This is done by “binding” ESC O P to [pf1] in
input-decode-map. Thus, when you type C-c PF1 on
the terminal, the terminal emits the character sequence C-c
ESC O P, and read-key-sequence translates this back into
C-c PF1 and returns it as the vector [?\C-c pf1].
Translation keymaps take effect only after Emacs has decoded the
keyboard input (via the input coding system specified by
keyboard-coding-system). See section Terminal I/O Encoding.
This variable holds a keymap that describes the character sequences sent by function keys on an ordinary character terminal.
The value of input-decode-map is usually set up automatically
according to the terminal’s Terminfo or Termcap entry, but sometimes
those need help from terminal-specific Lisp files. Emacs comes with
terminal-specific files for many common terminals; their main purpose is
to make entries in input-decode-map beyond those that can be
deduced from Termcap and Terminfo. See section Terminal-Specific Initialization.
This variable holds a keymap similar to input-decode-map except
that it describes key sequences which should be translated to
alternative interpretations that are usually preferred. It applies
after input-decode-map and before key-translation-map.
Entries in local-function-key-map are ignored if they conflict
with bindings made in the minor mode, local, or global keymaps. I.e.,
the remapping only applies if the original key sequence would
otherwise not have any binding.
local-function-key-map inherits from function-key-map,
but the latter should not be used directly.
This variable is another keymap used just like input-decode-map
to translate input events into other events. It differs from
input-decode-map in that it goes to work after
local-function-key-map is finished rather than before; it
receives the results of translation by local-function-key-map.
Just like input-decode-map, but unlike
local-function-key-map, this keymap is applied regardless of
whether the input key-sequence has a normal binding. Note however
that actual key bindings can have an effect on
key-translation-map, even though they are overridden by it.
Indeed, actual key bindings override local-function-key-map and
thus may alter the key sequence that key-translation-map
receives. Clearly, it is better to avoid this type of situation.
The intent of key-translation-map is for users to map one
character set to another, including ordinary characters normally bound
to self-insert-command.
You can use input-decode-map, local-function-key-map,
and key-translation-map for more than simple aliases, by using
a function, instead of a key sequence, as the “translation” of a
key. Then this function is called to compute the translation of that
key.
The key translation function receives one argument, which is the prompt
that was specified in read-key-sequence—or nil if the
key sequence is being read by the editor command loop. In most cases
you can ignore the prompt value.
If the function reads input itself, it can have the effect of altering the event that follows. For example, here’s how to define C-c h to turn the character that follows into a Hyper character:
(defun hyperify (prompt)
(let ((e (read-event)))
(vector (if (numberp e)
(logior (lsh 1 24) e)
(if (memq 'hyper (event-modifiers e))
e
(add-event-modifier "H-" e))))))
(defun add-event-modifier (string e)
(let ((symbol (if (symbolp e) e (car e))))
(setq symbol (intern (concat string
(symbol-name symbol))))
(if (symbolp e)
symbol
(cons symbol (cdr e)))))
(define-key local-function-key-map "\C-ch" 'hyperify)
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The end of a key sequence is detected when that key sequence either is bound to a command, or when Emacs determines that no additional event can lead to a sequence that is bound to a command.
This means that, while input-decode-map and key-translation-map
apply regardless of whether the original key sequence would have a binding, the
presence of such a binding can still prevent translation from taking place.
For example, let us return to our VT100 example above and add a binding for
C-c ESC to the global map; now when the user hits C-c
PF1 Emacs will fail to decode C-c ESC O P into C-c
PF1 because it will stop reading keys right after C-x ESC,
leaving O P for later. This is in case the user really hit C-c
ESC, in which case Emacs should not sit there waiting for the next key
to decide whether the user really pressed ESC or PF1.
For that reason, it is better to avoid binding commands to key sequences where the end of the key sequence is a prefix of a key translation. The main such problematic suffixes/prefixes are ESC, M-O (which is really ESC O) and M-[ (which is really ESC [).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes some convenient interactive interfaces for
changing key bindings. They work by calling define-key.
People often use global-set-key in their init files
(see section The Init File) for simple customization. For example,
(global-set-key (kbd "C-x C-\\") 'next-line)
or
(global-set-key [?\C-x ?\C-\\] 'next-line)
or
(global-set-key [(control ?x) (control ?\\)] 'next-line)
redefines C-x C-\ to move down a line.
(global-set-key [M-mouse-1] 'mouse-set-point)
redefines the first (leftmost) mouse button, entered with the Meta key, to set point where you click.
Be careful when using non-ASCII text characters in Lisp specifications of keys to bind. If these are read as multibyte text, as they usually will be in a Lisp file (see section Loading Non-ASCII Characters), you must type the keys as multibyte too. For instance, if you use this:
(global-set-key "ö" 'my-function) ; bind o-umlaut
or
(global-set-key ?ö 'my-function) ; bind o-umlaut
and your language environment is multibyte Latin-1, these commands actually bind the multibyte character with code 246, not the byte code 246 (M-v) sent by a Latin-1 terminal. In order to use this binding, you need to teach Emacs how to decode the keyboard by using an appropriate input method (see Input Methods in The GNU Emacs Manual).
This function sets the binding of key in the current global map to binding.
(global-set-key key binding) ≡ (define-key (current-global-map) key binding)
This function removes the binding of key from the current global map.
One use of this function is in preparation for defining a longer key that uses key as a prefix—which would not be allowed if key has a non-prefix binding. For example:
(global-unset-key "\C-l")
⇒ nil
(global-set-key "\C-l\C-l" 'redraw-display)
⇒ nil
This function is equivalent to using define-key as follows:
(global-unset-key key) ≡ (define-key (current-global-map) key nil)
This function sets the binding of key in the current local keymap to binding.
(local-set-key key binding) ≡ (define-key (current-local-map) key binding)
This function removes the binding of key from the current local map.
(local-unset-key key) ≡ (define-key (current-local-map) key nil)
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes functions used to scan all the current keymaps for the sake of printing help information.
This function returns a list of all the keymaps that can be reached (via
zero or more prefix keys) from keymap. The value is an
association list with elements of the form (key .
map), where key is a prefix key whose definition in
keymap is map.
The elements of the alist are ordered so that the key increases
in length. The first element is always ([] . keymap),
because the specified keymap is accessible from itself with a prefix of
no events.
If prefix is given, it should be a prefix key sequence; then
accessible-keymaps includes only the submaps whose prefixes start
with prefix. These elements look just as they do in the value of
(accessible-keymaps); the only difference is that some elements
are omitted.
In the example below, the returned alist indicates that the key
ESC, which is displayed as ‘^[’, is a prefix key whose
definition is the sparse keymap (keymap (83 . center-paragraph)
(115 . foo)).
(accessible-keymaps (current-local-map))
⇒(([] keymap
(27 keymap ; Note this keymap for ESC is repeated below.
(83 . center-paragraph)
(115 . center-line))
(9 . tab-to-tab-stop))
("^[" keymap
(83 . center-paragraph)
(115 . foo)))
In the following example, C-h is a prefix key that uses a sparse
keymap starting with (keymap (118 . describe-variable)…).
Another prefix, C-x 4, uses a keymap which is also the value of
the variable ctl-x-4-map. The event mode-line is one of
several dummy events used as prefixes for mouse actions in special parts
of a window.
(accessible-keymaps (current-global-map))
⇒ (([] keymap [set-mark-command beginning-of-line …
delete-backward-char])
("^H" keymap (118 . describe-variable) …
(8 . help-for-help))
("^X" keymap [x-flush-mouse-queue …
backward-kill-sentence])
("^[" keymap [mark-sexp backward-sexp …
backward-kill-word])
("^X4" keymap (15 . display-buffer) …)
([mode-line] keymap
(S-mouse-2 . mouse-split-window-horizontally) …))
These are not all the keymaps you would see in actuality.
The function map-keymap calls function once
for each binding in keymap. It passes two arguments,
the event type and the value of the binding. If keymap
has a parent, the parent’s bindings are included as well.
This works recursively: if the parent has itself a parent, then the
grandparent’s bindings are also included and so on.
This function is the cleanest way to examine all the bindings in a keymap.
This function is a subroutine used by the where-is command
(see Help in The GNU Emacs Manual). It returns a list
of all key sequences (of any length) that are bound to command in a
set of keymaps.
The argument command can be any object; it is compared with all
keymap entries using eq.
If keymap is nil, then the maps used are the current active
keymaps, disregarding overriding-local-map (that is, pretending
its value is nil). If keymap is a keymap, then the
maps searched are keymap and the global keymap. If keymap
is a list of keymaps, only those keymaps are searched.
Usually it’s best to use overriding-local-map as the expression
for keymap. Then where-is-internal searches precisely
the keymaps that are active. To search only the global map, pass the
value (keymap) (an empty keymap) as keymap.
If firstonly is non-ascii, then the value is a single
vector representing the first key sequence found, rather than a list of
all possible key sequences. If firstonly is t, then the
value is the first key sequence, except that key sequences consisting
entirely of ASCII characters (or meta variants of ASCII
characters) are preferred to all other key sequences and that the
return value can never be a menu binding.
If noindirect is non-nil, where-is-internal doesn’t
follow indirect keymap bindings. This makes it possible to search for
an indirect definition itself.
The fifth argument, no-remap, determines how this function treats command remappings (see section Remapping Commands). There are two cases of interest:
If no-remap is nil, find the bindings for
other-command and treat them as though they are also bindings
for command. If no-remap is non-nil, include the
vector [remap other-command] in the list of possible key
sequences, instead of finding those bindings.
If no-remap is nil, return the bindings for
other-command rather than command. If no-remap is
non-nil, return the bindings for command, ignoring the
fact that it is remapped.
This function creates a listing of all current key bindings, and displays it in a buffer named *Help*. The text is grouped by modes—minor modes first, then the major mode, then global bindings.
If prefix is non-nil, it should be a prefix key; then the
listing includes only keys that start with prefix.
When several characters with consecutive ASCII codes have the
same definition, they are shown together, as
‘firstchar..lastchar’. In this instance, you need to
know the ASCII codes to understand which characters this means.
For example, in the default global map, the characters ‘SPC
.. ~’ are described by a single line. SPC is ASCII 32,
~ is ASCII 126, and the characters between them include all
the normal printing characters, (e.g., letters, digits, punctuation,
etc.); all these characters are bound to self-insert-command.
If buffer-or-name is non-nil, it should be a buffer or a
buffer name. Then describe-bindings lists that buffer’s bindings,
instead of the current buffer’s.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A keymap can operate as a menu as well as defining bindings for keyboard keys and mouse buttons. Menus are usually actuated with the mouse, but they can function with the keyboard also. If a menu keymap is active for the next input event, that activates the keyboard menu feature.
| 21.17.1 Defining Menus | How to make a keymap that defines a menu. | |
| 21.17.2 Menus and the Mouse | How users actuate the menu with the mouse. | |
| 21.17.3 Menus and the Keyboard | How users actuate the menu with the keyboard. | |
| 21.17.4 Menu Example | Making a simple menu. | |
| 21.17.5 The Menu Bar | How to customize the menu bar. | |
| 21.17.6 Tool bars | A tool bar is a row of images. | |
| 21.17.7 Modifying Menus | How to add new items to a menu. | |
| 21.17.8 Easy Menu | A convenience macro for making menus. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A keymap acts as a menu if it has an overall prompt string, which is a string that appears as an element of the keymap. (See section Format of Keymaps.) The string should describe the purpose of the menu’s commands. Emacs displays the overall prompt string as the menu title in some cases, depending on the toolkit (if any) used for displaying menus.12 Keyboard menus also display the overall prompt string.
The easiest way to construct a keymap with a prompt string is to
specify the string as an argument when you call make-keymap,
make-sparse-keymap (see section Creating Keymaps), or
define-prefix-command (see Definition of define-prefix-command). If you do not want the keymap to operate as
a menu, don’t specify a prompt string for it.
This function returns the overall prompt string of keymap,
or nil if it has none.
The menu’s items are the bindings in the keymap. Each binding associates an event type to a definition, but the event types have no significance for the menu appearance. (Usually we use pseudo-events, symbols that the keyboard cannot generate, as the event types for menu item bindings.) The menu is generated entirely from the bindings that correspond in the keymap to these events.
The order of items in the menu is the same as the order of bindings in
the keymap. Since define-key puts new bindings at the front, you
should define the menu items starting at the bottom of the menu and
moving to the top, if you care about the order. When you add an item to
an existing menu, you can specify its position in the menu using
define-key-after (see section Modifying Menus).
| 21.17.1.1 Simple Menu Items | A simple kind of menu key binding. | |
| 21.17.1.2 Extended Menu Items | More complex menu item definitions. | |
| 21.17.1.3 Menu Separators | Drawing a horizontal line through a menu. | |
| 21.17.1.4 Alias Menu Items | Using command aliases in menu items. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The simpler (and original) way to define a menu item is to bind some event type (it doesn’t matter what event type) to a binding like this:
(item-string . real-binding)
The CAR, item-string, is the string to be displayed in the menu. It should be short—preferably one to three words. It should describe the action of the command it corresponds to. Note that not all graphical toolkits can display non-ASCII text in menus (it will work for keyboard menus and will work to a large extent with the GTK+ toolkit).
You can also supply a second string, called the help string, as follows:
(item-string help . real-binding)
help specifies a “help-echo” string to display while the mouse
is on that item in the same way as help-echo text properties
(see Help display).
As far as define-key is concerned, item-string and
help-string are part of the event’s binding. However,
lookup-key returns just real-binding, and only
real-binding is used for executing the key.
If real-binding is nil, then item-string appears in
the menu but cannot be selected.
If real-binding is a symbol and has a non-nil
menu-enable property, that property is an expression that
controls whether the menu item is enabled. Every time the keymap is
used to display a menu, Emacs evaluates the expression, and it enables
the menu item only if the expression’s value is non-nil. When a
menu item is disabled, it is displayed in a “fuzzy” fashion, and
cannot be selected.
The menu bar does not recalculate which items are enabled every time you
look at a menu. This is because the X toolkit requires the whole tree
of menus in advance. To force recalculation of the menu bar, call
force-mode-line-update (see section Mode Line Format).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
An extended-format menu item is a more flexible and also cleaner
alternative to the simple format. You define an event type with a
binding that’s a list starting with the symbol menu-item.
For a non-selectable string, the binding looks like this:
(menu-item item-name)
A string starting with two or more dashes specifies a separator line; see Menu Separators.
To define a real menu item which can be selected, the extended format binding looks like this:
(menu-item item-name real-binding
. item-property-list)
Here, item-name is an expression which evaluates to the menu item string. Thus, the string need not be a constant. The third element, real-binding, is the command to execute. The tail of the list, item-property-list, has the form of a property list which contains other information.
Here is a table of the properties that are supported:
:enable formThe result of evaluating form determines whether the item is
enabled (non-nil means yes). If the item is not enabled,
you can’t really click on it.
:visible formThe result of evaluating form determines whether the item should
actually appear in the menu (non-nil means yes). If the item
does not appear, then the menu is displayed as if this item were
not defined at all.
:help helpThe value of this property, help, specifies a “help-echo” string
to display while the mouse is on that item. This is displayed in the
same way as help-echo text properties (see Help display).
Note that this must be a constant string, unlike the help-echo
property for text and overlays.
:button (type . selected)This property provides a way to define radio buttons and toggle buttons.
The CAR, type, says which: it should be :toggle or
:radio. The CDR, selected, should be a form; the
result of evaluating it says whether this button is currently selected.
A toggle is a menu item which is labeled as either “on” or “off”
according to the value of selected. The command itself should
toggle selected, setting it to t if it is nil,
and to nil if it is t. Here is how the menu item
to toggle the debug-on-error flag is defined:
(menu-item "Debug on Error" toggle-debug-on-error
:button (:toggle
. (and (boundp 'debug-on-error)
debug-on-error)))
This works because toggle-debug-on-error is defined as a command
which toggles the variable debug-on-error.
Radio buttons are a group of menu items, in which at any time one and only one is “selected”. There should be a variable whose value says which one is selected at any time. The selected form for each radio button in the group should check whether the variable has the right value for selecting that button. Clicking on the button should set the variable so that the button you clicked on becomes selected.
:key-sequence key-sequenceThis property specifies which key sequence is likely to be bound to the same command invoked by this menu item. If you specify the right key sequence, that makes preparing the menu for display run much faster.
If you specify the wrong key sequence, it has no effect; before Emacs displays key-sequence in the menu, it verifies that key-sequence is really equivalent to this menu item.
:key-sequence nilThis property indicates that there is normally no key binding which is equivalent to this menu item. Using this property saves time in preparing the menu for display, because Emacs does not need to search the keymaps for a keyboard equivalent for this menu item.
However, if the user has rebound this item’s definition to a key
sequence, Emacs ignores the :keys property and finds the keyboard
equivalent anyway.
:keys stringThis property specifies that string is the string to display as the keyboard equivalent for this menu item. You can use the ‘\\[...]’ documentation construct in string.
:filter filter-fnThis property provides a way to compute the menu item dynamically. The property value filter-fn should be a function of one argument; when it is called, its argument will be real-binding. The function should return the binding to use instead.
Emacs can call this function at any time that it does redisplay or operates on menu data structures, so you should write it so it can safely be called at any time.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A menu separator is a kind of menu item that doesn’t display any text—instead, it divides the menu into subparts with a horizontal line. A separator looks like this in the menu keymap:
(menu-item separator-type)
where separator-type is a string starting with two or more dashes.
In the simplest case, separator-type consists of only dashes.
That specifies the default kind of separator. (For compatibility,
"" and - also count as separators.)
Certain other values of separator-type specify a different style of separator. Here is a table of them:
"--no-line""--space"An extra vertical space, with no actual line.
"--single-line"A single line in the menu’s foreground color.
"--double-line"A double line in the menu’s foreground color.
"--single-dashed-line"A single dashed line in the menu’s foreground color.
"--double-dashed-line"A double dashed line in the menu’s foreground color.
"--shadow-etched-in"A single line with a 3D sunken appearance. This is the default, used separators consisting of dashes only.
"--shadow-etched-out"A single line with a 3D raised appearance.
"--shadow-etched-in-dash"A single dashed line with a 3D sunken appearance.
"--shadow-etched-out-dash"A single dashed line with a 3D raised appearance.
"--shadow-double-etched-in"Two lines with a 3D sunken appearance.
"--shadow-double-etched-out"Two lines with a 3D raised appearance.
"--shadow-double-etched-in-dash"Two dashed lines with a 3D sunken appearance.
"--shadow-double-etched-out-dash"Two dashed lines with a 3D raised appearance.
You can also give these names in another style, adding a colon after
the double-dash and replacing each single dash with capitalization of
the following word. Thus, "--:singleLine", is equivalent to
"--single-line".
You can use a longer form to specify keywords such as :enable
and :visible for a menu separator:
(menu-item separator-type nil . item-property-list)
For example:
(menu-item "--" nil :visible (boundp 'foo))
Some systems and display toolkits don’t really handle all of these separator types. If you use a type that isn’t supported, the menu displays a similar kind of separator that is supported.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Sometimes it is useful to make menu items that use the “same”
command but with different enable conditions. The best way to do this
in Emacs now is with extended menu items; before that feature existed,
it could be done by defining alias commands and using them in menu
items. Here’s an example that makes two aliases for
read-only-mode and gives them different enable conditions:
(defalias 'make-read-only 'read-only-mode) (put 'make-read-only 'menu-enable '(not buffer-read-only)) (defalias 'make-writable 'read-only-mode) (put 'make-writable 'menu-enable 'buffer-read-only)
When using aliases in menus, often it is useful to display the
equivalent key bindings for the “real” command name, not the aliases
(which typically don’t have any key bindings except for the menu
itself). To request this, give the alias symbol a non-nil
menu-alias property. Thus,
(put 'make-read-only 'menu-alias t) (put 'make-writable 'menu-alias t)
causes menu items for make-read-only and make-writable to
show the keyboard bindings for read-only-mode.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The usual way to make a menu keymap produce a menu is to make it the definition of a prefix key. (A Lisp program can explicitly pop up a menu and receive the user’s choice—see Pop-Up Menus.)
If the prefix key ends with a mouse event, Emacs handles the menu keymap by popping up a visible menu, so that the user can select a choice with the mouse. When the user clicks on a menu item, the event generated is whatever character or symbol has the binding that brought about that menu item. (A menu item may generate a series of events if the menu has multiple levels or comes from the menu bar.)
It’s often best to use a button-down event to trigger the menu. Then the user can select a menu item by releasing the button.
If the menu keymap contains a binding to a nested keymap, the nested keymap specifies a submenu. There will be a menu item, labeled by the nested keymap’s item string, and clicking on this item automatically pops up the specified submenu. As a special exception, if the menu keymap contains a single nested keymap and no other menu items, the menu shows the contents of the nested keymap directly, not as a submenu.
However, if Emacs is compiled without X toolkit support, or on text terminals, submenus are not supported. Each nested keymap is shown as a menu item, but clicking on it does not automatically pop up the submenu. If you wish to imitate the effect of submenus, you can do that by giving a nested keymap an item string which starts with ‘@’. This causes Emacs to display the nested keymap using a separate menu pane; the rest of the item string after the ‘@’ is the pane label. If Emacs is compiled without X toolkit support, or if a menu is displayed on a text terminal, menu panes are not used; in that case, a ‘@’ at the beginning of an item string is omitted when the menu label is displayed, and has no other effect.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When a prefix key ending with a keyboard event (a character or function key) has a definition that is a menu keymap, the keymap operates as a keyboard menu; the user specifies the next event by choosing a menu item with the keyboard.
Emacs displays the keyboard menu with the map’s overall prompt
string, followed by the alternatives (the item strings of the map’s
bindings), in the echo area. If the bindings don’t all fit at once,
the user can type SPC to see the next line of alternatives.
Successive uses of SPC eventually get to the end of the menu and
then cycle around to the beginning. (The variable
menu-prompt-more-char specifies which character is used for
this; SPC is the default.)
When the user has found the desired alternative from the menu, he or she should type the corresponding character—the one whose binding is that alternative.
This variable specifies the character to use to ask to see the next line of a menu. Its initial value is 32, the code for SPC.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here is a complete example of defining a menu keymap. It is the definition of the ‘Replace’ submenu in the ‘Edit’ menu in the menu bar, and it uses the extended menu item format (see section Extended Menu Items). First we create the keymap, and give it a name:
(defvar menu-bar-replace-menu (make-sparse-keymap "Replace"))
Next we define the menu items:
(define-key menu-bar-replace-menu [tags-repl-continue]
'(menu-item "Continue Replace" tags-loop-continue
:help "Continue last tags replace operation"))
(define-key menu-bar-replace-menu [tags-repl]
'(menu-item "Replace in tagged files" tags-query-replace
:help "Interactively replace a regexp in all tagged files"))
(define-key menu-bar-replace-menu [separator-replace-tags]
'(menu-item "--"))
;; …
Note the symbols which the bindings are “made for”; these appear
inside square brackets, in the key sequence being defined. In some
cases, this symbol is the same as the command name; sometimes it is
different. These symbols are treated as “function keys”, but they are
not real function keys on the keyboard. They do not affect the
functioning of the menu itself, but they are “echoed” in the echo area
when the user selects from the menu, and they appear in the output of
where-is and apropos.
The menu in this example is intended for use with the mouse. If a menu is intended for use with the keyboard, that is, if it is bound to a key sequence ending with a keyboard event, then the menu items should be bound to characters or “real” function keys, that can be typed with the keyboard.
The binding whose definition is ("--") is a separator line.
Like a real menu item, the separator has a key symbol, in this case
separator-replace-tags. If one menu has two separators, they
must have two different key symbols.
Here is how we make this menu appear as an item in the parent menu:
(define-key menu-bar-edit-menu [replace] (list 'menu-item "Replace" menu-bar-replace-menu))
Note that this incorporates the submenu keymap, which is the value of
the variable menu-bar-replace-menu, rather than the symbol
menu-bar-replace-menu itself. Using that symbol in the parent
menu item would be meaningless because menu-bar-replace-menu is
not a command.
If you wanted to attach the same replace menu to a mouse click, you can do it this way:
(define-key global-map [C-S-down-mouse-1] menu-bar-replace-menu)
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs usually shows a menu bar at the top of each frame.
See Menu Bars in The GNU Emacs Manual. Menu bar items are
subcommands of the fake “function key” menu-bar, as defined
in the active keymaps.
To add an item to the menu bar, invent a fake “function key” of your
own (let’s call it key), and make a binding for the key sequence
[menu-bar key]. Most often, the binding is a menu keymap,
so that pressing a button on the menu bar item leads to another menu.
When more than one active keymap defines the same “function key” for the menu bar, the item appears just once. If the user clicks on that menu bar item, it brings up a single, combined menu containing all the subcommands of that item—the global subcommands, the local subcommands, and the minor mode subcommands.
The variable overriding-local-map is normally ignored when
determining the menu bar contents. That is, the menu bar is computed
from the keymaps that would be active if overriding-local-map
were nil. See section Active Keymaps.
Here’s an example of setting up a menu bar item:
;; Make a menu keymap (with a prompt string) ;; and make it the menu bar item’s definition. (define-key global-map [menu-bar words] (cons "Words" (make-sparse-keymap "Words")))
;; Define specific subcommands in this menu.
(define-key global-map
[menu-bar words forward]
'("Forward word" . forward-word))
(define-key global-map
[menu-bar words backward]
'("Backward word" . backward-word))
A local keymap can cancel a menu bar item made by the global keymap by
rebinding the same fake function key with undefined as the
binding. For example, this is how Dired suppresses the ‘Edit’ menu
bar item:
(define-key dired-mode-map [menu-bar edit] 'undefined)
Here, edit is the fake function key used by the global map for
the ‘Edit’ menu bar item. The main reason to suppress a global
menu bar item is to regain space for mode-specific items.
Normally the menu bar shows global items followed by items defined by the local maps.
This variable holds a list of fake function keys for items to display at
the end of the menu bar rather than in normal sequence. The default
value is (help-menu); thus, the ‘Help’ menu item normally appears
at the end of the menu bar, following local menu items.
This normal hook is run by redisplay to update the menu bar contents, before redisplaying the menu bar. You can use it to update menus whose contents should vary. Since this hook is run frequently, we advise you to ensure that the functions it calls do not take much time in the usual case.
Next to every menu bar item, Emacs displays a key binding that runs
the same command (if such a key binding exists). This serves as a
convenient hint for users who do not know the key binding. If a
command has multiple bindings, Emacs normally displays the first one
it finds. You can specify one particular key binding by assigning an
:advertised-binding symbol property to the command. See section Substituting Key Bindings in Documentation.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A tool bar is a row of clickable icons at the top of a frame, just below the menu bar. See Tool Bars in The GNU Emacs Manual. Emacs normally shows a tool bar on graphical displays.
On each frame, the frame parameter tool-bar-lines controls
how many lines’ worth of height to reserve for the tool bar. A zero
value suppresses the tool bar. If the value is nonzero, and
auto-resize-tool-bars is non-nil, the tool bar expands
and contracts automatically as needed to hold the specified contents.
If the value is grow-only, the tool bar expands automatically,
but does not contract automatically.
The tool bar contents are controlled by a menu keymap attached to a
fake “function key” called tool-bar (much like the way the menu
bar is controlled). So you define a tool bar item using
define-key, like this:
(define-key global-map [tool-bar key] item)
where key is a fake “function key” to distinguish this item from other items, and item is a menu item key binding (see section Extended Menu Items), which says how to display this item and how it behaves.
The usual menu keymap item properties, :visible,
:enable, :button, and :filter, are useful in
tool bar bindings and have their normal meanings. The real-binding
in the item must be a command, not a keymap; in other words, it does not
work to define a tool bar icon as a prefix key.
The :help property specifies a “help-echo” string to display
while the mouse is on that item. This is displayed in the same way as
help-echo text properties (see Help display).
In addition, you should use the :image property;
this is how you specify the image to display in the tool bar:
:image imageimages is either a single image specification or a vector of four image specifications. If you use a vector of four, one of them is used, depending on circumstances:
Used when the item is enabled and selected.
Used when the item is enabled and deselected.
Used when the item is disabled and selected.
Used when the item is disabled and deselected.
The GTK+ and NS versions of Emacs ignores items 1 to 3, because disabled and/or deselected images are autocomputed from item 0.
If image is a single image specification, Emacs draws the tool bar button in disabled state by applying an edge-detection algorithm to the image.
The :rtl property specifies an alternative image to use for
right-to-left languages. Only the GTK+ version of Emacs supports this
at present.
Like the menu bar, the tool bar can display separators (see section Menu Separators). Tool bar separators are vertical rather than
horizontal, though, and only a single style is supported. They are
represented in the tool bar keymap by (menu-item "--") entries;
properties like :visible are not supported for tool bar
separators. Separators are rendered natively in GTK+ and Nextstep
tool bars; in the other cases, they are rendered using an image of a
vertical line.
The default tool bar is defined so that items specific to editing do not
appear for major modes whose command symbol has a mode-class
property of special (see section Major Mode Conventions). Major
modes may add items to the global bar by binding [tool-bar
foo] in their local map. It makes sense for some major modes to
replace the default tool bar items completely, since not many can be
accommodated conveniently, and the default bindings make this easy by
using an indirection through tool-bar-map.
By default, the global map binds [tool-bar] as follows:
(global-set-key [tool-bar]
`(menu-item ,(purecopy "tool bar") ignore
:filter tool-bar-make-keymap))
The function tool-bar-make-keymap, in turn, derives the actual
tool bar map dynamically from the value of the variable
tool-bar-map. Hence, you should normally adjust the default
(global) tool bar by changing that map. Some major modes, such as
Info mode, completely replace the global tool bar by making
tool-bar-map buffer-local and setting it to a different keymap.
There are two convenience functions for defining tool bar items, as follows.
This function adds an item to the tool bar by modifying
tool-bar-map. The image to use is defined by icon, which
is the base name of an XPM, XBM or PBM image file to be located by
find-image. Given a value ‘"exit"’, say, exit.xpm,
exit.pbm and exit.xbm would be searched for in that order
on a color display. On a monochrome display, the search order is
‘.pbm’, ‘.xbm’ and ‘.xpm’. The binding to use is the
command def, and key is the fake function key symbol in the
prefix keymap. The remaining arguments props are additional
property list elements to add to the menu item specification.
To define items in some local map, bind tool-bar-map with
let around calls of this function:
(defvar foo-tool-bar-map
(let ((tool-bar-map (make-sparse-keymap)))
(tool-bar-add-item …)
…
tool-bar-map))
This function is a convenience for defining tool bar items which are
consistent with existing menu bar bindings. The binding of
command is looked up in the menu bar in map (default
global-map) and modified to add an image specification for
icon, which is found in the same way as by
tool-bar-add-item. The resulting binding is then placed in
tool-bar-map, so use this function only for global tool bar
items.
map must contain an appropriate keymap bound to
[menu-bar]. The remaining arguments props are additional
property list elements to add to the menu item specification.
This function is used for making non-global tool bar items. Use it
like tool-bar-add-item-from-menu except that in-map
specifies the local map to make the definition in. The argument
from-map is like the map argument of
tool-bar-add-item-from-menu.
If this variable is non-nil, the tool bar automatically resizes to
show all defined tool bar items—but not larger than a quarter of the
frame’s height.
If the value is grow-only, the tool bar expands automatically,
but does not contract automatically. To contract the tool bar, the
user has to redraw the frame by entering C-l.
If Emacs is built with GTK or Nextstep, the tool bar can only show one line, so this variable has no effect.
If this variable is non-nil, tool bar items display
in raised form when the mouse moves over them.
This variable specifies an extra margin to add around tool bar items. The value is an integer, a number of pixels. The default is 4.
This variable specifies the shadow width for tool bar items. The value is an integer, a number of pixels. The default is 1.
This variable specifies the height of the border drawn below the tool
bar area. An integer specifies height as a number of pixels.
If the value is one of internal-border-width (the default) or
border-width, the tool bar border height corresponds to the
corresponding frame parameter.
You can define a special meaning for clicking on a tool bar item with the shift, control, meta, etc., modifiers. You do this by setting up additional items that relate to the original item through the fake function keys. Specifically, the additional items should use the modified versions of the same fake function key used to name the original item.
Thus, if the original item was defined this way,
(define-key global-map [tool-bar shell]
'(menu-item "Shell" shell
:image (image :type xpm :file "shell.xpm")))
then here is how you can define clicking on the same tool bar image with the shift modifier:
(define-key global-map [tool-bar S-shell] 'some-command)
See section Function Keys, for more information about how to add modifiers to function keys.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When you insert a new item in an existing menu, you probably want to
put it in a particular place among the menu’s existing items. If you
use define-key to add the item, it normally goes at the front of
the menu. To put it elsewhere in the menu, use define-key-after:
Define a binding in map for key, with value binding,
just like define-key, but position the binding in map after
the binding for the event after. The argument key should be
of length one—a vector or string with just one element. But
after should be a single event type—a symbol or a character, not
a sequence. The new binding goes after the binding for after. If
after is t or is omitted, then the new binding goes last, at
the end of the keymap. However, new bindings are added before any
inherited keymap.
Here is an example:
(define-key-after my-menu [drink]
'("Drink" . drink-command) 'eat)
makes a binding for the fake function key DRINK and puts it right after the binding for EAT.
Here is how to insert an item called ‘Work’ in the ‘Signals’
menu of Shell mode, after the item break:
(define-key-after
(lookup-key shell-mode-map [menu-bar signals])
[work] '("Work" . work-command) 'break)
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The following macro provides a convenient way to define pop-up menus and/or menu bar menus.
This macro defines a pop-up menu and/or menu bar submenu, whose contents are given by menu.
If symbol is non-nil, it should be a symbol; then this
macro defines symbol as a function for popping up the menu
(see section Pop-Up Menus), with doc as its documentation string.
symbol should not be quoted.
Regardless of the value of symbol, if maps is a keymap, the menu is added to that keymap, as a top-level menu for the menu bar (see section The Menu Bar). It can also be a list of keymaps, in which case the menu is added separately to each of those keymaps.
The first element of menu must be a string, which serves as the menu label. It may be followed by any number of the following keyword-argument pairs:
:filter functionfunction must be a function which, if called with one argument—the list of the other menu items—returns the actual items to be displayed in the menu.
:visible includeinclude is an expression; if it evaluates to nil, the
menu is made invisible. :included is an alias for
:visible.
:active enableenable is an expression; if it evaluates to nil, the menu
is not selectable. :enable is an alias for :active.
The remaining elements in menu are menu items.
A menu item can be a vector of three elements, [name
callback enable]. name is the menu item name (a
string). callback is a command to run, or an expression to
evaluate, when the item is chosen. enable is an expression; if
it evaluates to nil, the item is disabled for selection.
Alternatively, a menu item may have the form:
[ name callback [ keyword arg ]... ]
where name and callback have the same meanings as above, and each optional keyword and arg pair should be one of the following:
:keys keyskeys is a keyboard equivalent to the menu item (a string). This
is normally not needed, as keyboard equivalents are computed
automatically. keys is expanded with
substitute-command-keys before it is displayed (see section Substituting Key Bindings in Documentation).
:key-sequence keyskeys is a hint for speeding up Emacs’s first display of the
menu. It should be nil if you know that the menu item has no keyboard
equivalent; otherwise it should be a string or vector specifying a
keyboard equivalent for the menu item.
:active enableenable is an expression; if it evaluates to nil, the item
is make unselectable.. :enable is an alias for :active.
:visible includeinclude is an expression; if it evaluates to nil, the
item is made invisible. :included is an alias for
:visible.
:label formform is an expression that is evaluated to obtain a value which serves as the menu item’s label (the default is name).
:suffix formform is an expression that is dynamically evaluated and whose value is concatenated with the menu entry’s label.
:style stylestyle is a symbol describing the type of menu item; it should be
toggle (a checkbox), or radio (a radio button), or
anything else (meaning an ordinary menu item).
:selected selectedselected is an expression; the checkbox or radio button is
selected whenever the expression’s value is non-nil.
:help helphelp is a string describing the menu item.
Alternatively, a menu item can be a string. Then that string appears in the menu as unselectable text. A string consisting of dashes is displayed as a separator (see section Menu Separators).
Alternatively, a menu item can be a list with the same format as menu. This is a submenu.
Here is an example of using easy-menu-define to define a menu
similar to the one defined in the example in The Menu Bar:
(easy-menu-define words-menu global-map
"Menu for word navigation commands."
'("Words"
["Forward word" forward-word]
["Backward word" backward-word]))
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A mode is a set of definitions that customize Emacs and can be turned on and off while you edit. There are two varieties of modes: major modes, which are mutually exclusive and used for editing particular kinds of text, and minor modes, which provide features that users can enable individually.
This chapter describes how to write both major and minor modes, how to indicate them in the mode line, and how they run hooks supplied by the user. For related topics such as keymaps and syntax tables, see Keymaps, and Syntax Tables.
| 22.1 Hooks | How to use hooks; how to write code that provides hooks. | |
| 22.2 Major Modes | Defining major modes. | |
| 22.3 Minor Modes | Defining minor modes. | |
| 22.4 Mode Line Format | Customizing the text that appears in the mode line. | |
| 22.5 Imenu | Providing a menu of definitions made in a buffer. | |
| 22.6 Font Lock Mode | How modes can highlight text according to syntax. | |
| 22.7 Automatic Indentation of code | How to teach Emacs to indent for a major mode. | |
| 22.8 Desktop Save Mode | How modes can have buffer state saved between Emacs sessions. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A hook is a variable where you can store a function or functions to be called on a particular occasion by an existing program. Emacs provides hooks for the sake of customization. Most often, hooks are set up in the init file (see section The Init File), but Lisp programs can set them also. See section Standard Hooks, for a list of some standard hook variables.
Most of the hooks in Emacs are normal hooks. These variables contain lists of functions to be called with no arguments. By convention, whenever the hook name ends in ‘-hook’, that tells you it is normal. We try to make all hooks normal, as much as possible, so that you can use them in a uniform way.
Every major mode command is supposed to run a normal hook called the
mode hook as one of the last steps of initialization. This makes
it easy for a user to customize the behavior of the mode, by overriding
the buffer-local variable assignments already made by the mode. Most
minor mode functions also run a mode hook at the end. But hooks are
used in other contexts too. For example, the hook suspend-hook
runs just before Emacs suspends itself (see section Suspending Emacs).
The recommended way to add a hook function to a hook is by calling
add-hook (see section Setting Hooks). The hook functions may be any
of the valid kinds of functions that funcall accepts (see section What Is a Function?). Most normal hook variables are initially void;
add-hook knows how to deal with this. You can add hooks either
globally or buffer-locally with add-hook.
If the hook variable’s name does not end with ‘-hook’, that
indicates it is probably an abnormal hook. That means the hook
functions are called with arguments, or their return values are used
in some way. The hook’s documentation says how the functions are
called. You can use add-hook to add a function to an abnormal
hook, but you must write the function to follow the hook’s calling
convention. By convention, abnormal hook names end in ‘-functions’.
If the variable’s name ends in ‘-function’, then its value is
just a single function, not a list of functions. add-hook cannot be
used to modify such a single function hook, and you have to use
add-function instead (see section Advising Emacs Lisp Functions).
| 22.1.1 Running Hooks | How to run a hook. | |
| 22.1.2 Setting Hooks | How to put functions on a hook, or remove them. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In this section, we document the run-hooks function, which is
used to run a normal hook. We also document the functions for running
various kinds of abnormal hooks.
This function takes one or more normal hook variable names as arguments, and runs each hook in turn. Each argument should be a symbol that is a normal hook variable. These arguments are processed in the order specified.
If a hook variable has a non-nil value, that value should be a
list of functions. run-hooks calls all the functions, one by
one, with no arguments.
The hook variable’s value can also be a single function—either a
lambda expression or a symbol with a function definition—which
run-hooks calls. But this usage is obsolete.
If the hook variable is buffer-local, the buffer-local variable will
be used instead of the global variable. However, if the buffer-local
variable contains the element t, the global hook variable will
be run as well.
This function runs an abnormal hook by calling all the hook functions in hook, passing each one the arguments args.
This function runs an abnormal hook by calling each hook function in
turn, stopping if one of them “fails” by returning nil. Each
hook function is passed the arguments args. If this function
stops because one of the hook functions fails, it returns nil;
otherwise it returns a non-nil value.
This function runs an abnormal hook by calling each hook function,
stopping if one of them “succeeds” by returning a non-nil
value. Each hook function is passed the arguments args. If this
function stops because one of the hook functions returns a
non-nil value, it returns that value; otherwise it returns
nil.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here’s an example that uses a mode hook to turn on Auto Fill mode when in Lisp Interaction mode:
(add-hook 'lisp-interaction-mode-hook 'auto-fill-mode)
This function is the handy way to add function function to hook variable hook. You can use it for abnormal hooks as well as for normal hooks. function can be any Lisp function that can accept the proper number of arguments for hook. For example,
(add-hook 'text-mode-hook 'my-text-hook-function)
adds my-text-hook-function to the hook called text-mode-hook.
If function is already present in hook (comparing using
equal), then add-hook does not add it a second time.
If function has a non-nil property
permanent-local-hook, then kill-all-local-variables (or
changing major modes) won’t delete it from the hook variable’s local
value.
For a normal hook, hook functions should be designed so that the order
in which they are executed does not matter. Any dependence on the order
is asking for trouble. However, the order is predictable: normally,
function goes at the front of the hook list, so it is executed
first (barring another add-hook call). If the optional argument
append is non-nil, the new hook function goes at the end of
the hook list and is executed last.
add-hook can handle the cases where hook is void or its
value is a single function; it sets or changes the value to a list of
functions.
If local is non-nil, that says to add function to the
buffer-local hook list instead of to the global hook list. This makes
the hook buffer-local and adds t to the buffer-local value. The
latter acts as a flag to run the hook functions in the default value as
well as in the local value.
This function removes function from the hook variable
hook. It compares function with elements of hook
using equal, so it works for both symbols and lambda
expressions.
If local is non-nil, that says to remove function
from the buffer-local hook list instead of from the global hook list.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Major modes specialize Emacs for editing particular kinds of text. Each buffer has one major mode at a time. Every major mode is associated with a major mode command, whose name should end in ‘-mode’. This command takes care of switching to that mode in the current buffer, by setting various buffer-local variables such as a local keymap. See section Major Mode Conventions.
The least specialized major mode is called Fundamental mode, which has no mode-specific definitions or variable settings.
This is the major mode command for Fundamental mode. Unlike other mode commands, it does not run any mode hooks (see section Major Mode Conventions), since you are not supposed to customize this mode.
The easiest way to write a major mode is to use the macro
define-derived-mode, which sets up the new mode as a variant of
an existing major mode. See section Defining Derived Modes. We recommend using
define-derived-mode even if the new mode is not an obvious
derivative of another mode, as it automatically enforces many coding
conventions for you. See section Basic Major Modes, for common modes to
derive from.
The standard GNU Emacs Lisp directory tree contains the code for several major modes, in files such as text-mode.el, texinfo.el, lisp-mode.el, and rmail.el. You can study these libraries to see how modes are written.
The buffer-local value of this variable holds the symbol for the current
major mode. Its default value holds the default major mode for new
buffers. The standard default value is fundamental-mode.
If the default value is nil, then whenever Emacs creates a new
buffer via a command such as C-x b (switch-to-buffer), the
new buffer is put in the major mode of the previously current buffer.
As an exception, if the major mode of the previous buffer has a
mode-class symbol property with value special, the new
buffer is put in Fundamental mode (see section Major Mode Conventions).
| 22.2.1 Major Mode Conventions | Coding conventions for keymaps, etc. | |
| 22.2.2 How Emacs Chooses a Major Mode | How Emacs chooses the major mode automatically. | |
| 22.2.3 Getting Help about a Major Mode | Finding out how to use a mode. | |
| 22.2.4 Defining Derived Modes | Defining a new major mode based on another major mode. | |
| 22.2.5 Basic Major Modes | Modes that other modes are often derived from. | |
| 22.2.6 Mode Hooks | Hooks run at the end of major mode functions. | |
| 22.2.7 Tabulated List mode | Parent mode for buffers containing tabulated data. | |
| 22.2.8 Generic Modes | Defining a simple major mode that supports comment syntax and Font Lock mode. | |
| 22.2.9 Major Mode Examples | Text mode and Lisp modes. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The code for every major mode should follow various coding conventions, including conventions for local keymap and syntax table initialization, function and variable names, and hooks.
If you use the define-derived-mode macro, it will take care of
many of these conventions automatically. See section Defining Derived Modes. Note
also that Fundamental mode is an exception to many of these conventions,
because it represents the default state of Emacs.
The following list of conventions is only partial. Each major mode should aim for consistency in general with other Emacs major modes, as this makes Emacs as a whole more coherent. It is impossible to list here all the possible points where this issue might come up; if the Emacs developers point out an area where your major mode deviates from the usual conventions, please make it compatible.
The documentation string may include the special documentation substrings, ‘\[command]’, ‘\{keymap}’, and ‘\<keymap>’, which allow the help display to adapt automatically to the user’s own key bindings. See section Substituting Key Bindings in Documentation.
kill-all-local-variables. This runs the normal hook
change-major-mode-hook, then gets rid of the buffer-local
variables of the major mode previously in effect. See section Creating and Deleting Buffer-Local Bindings.
major-mode to the
major mode command symbol. This is how describe-mode discovers
which documentation to print.
mode-name to the
“pretty” name of the mode, usually a string (but see The Data Structure of the Mode Line, for other possible forms). The name of the mode appears
in the mode line.
indent-line-function
to a suitable function, and probably customize other variables
for indentation. See section Automatic Indentation of code.
use-local-map to install this local map. See section Active Keymaps, for more information.
This keymap should be stored permanently in a global variable named
modename-mode-map. Normally the library that defines the
mode sets this variable.
See section Tips for Defining Variables Robustly, for advice about how to write the code to set up the mode’s keymap variable.
A major mode can also rebind the keys M-n, M-p and M-s. The bindings for M-n and M-p should normally be some kind of “moving forward and backward”, but this does not necessarily mean cursor motion.
It is legitimate for a major mode to rebind a standard key sequence if it provides a command that does “the same job” in a way better suited to the text this mode is used for. For example, a major mode for editing a programming language might redefine C-M-a to “move to the beginning of a function” in a way that works better for that language.
It is also legitimate for a major mode to rebind a standard key sequence whose standard meaning is rarely useful in that mode. For instance, minibuffer modes rebind M-r, whose standard meaning is rarely of any use in the minibuffer. Major modes such as Dired or Rmail that do not allow self-insertion of text can reasonably redefine letters and other printing characters as special commands.
modename-mode-syntax-table. See section Syntax Tables.
modename-mode-abbrev-table. If the
major mode command defines any abbrevs itself, it should pass t
for the system-flag argument to define-abbrev.
See section Defining Abbrevs.
font-lock-defaults (see section Font Lock Mode).
imenu-generic-expression, for the two variables
imenu-prev-index-position-function and
imenu-extract-index-name-function, or for the variable
imenu-create-index-function (see section Imenu).
eldoc-documentation-function to tell ElDoc mode how to handle
this mode.
completion-at-point-functions. See section Completion in Ordinary Buffers.
make-local-variable in the major mode command, not
make-variable-buffer-local. The latter function would make the
variable local to every buffer in which it is subsequently set, which
would affect buffers that do not use this mode. It is undesirable for a
mode to have such global effects. See section Buffer-Local Variables.
With rare exceptions, the only reasonable way to use
make-variable-buffer-local in a Lisp package is for a variable
which is used only within that package. Using it on a variable used by
other packages would interfere with them.
modename-mode-hook. The very last thing the major mode command
should do is to call run-mode-hooks. This runs the normal
hook change-major-mode-after-body-hook, the mode hook,
and then the normal hook after-change-major-mode-hook.
See section Mode Hooks.
define-derived-mode
macro, but this is not required. Such a mode should call the parent
mode command inside a delay-mode-hooks form. (Using
define-derived-mode does this automatically.) See section Defining Derived Modes, and Mode Hooks.
change-major-mode-hook (see section Creating and Deleting Buffer-Local Bindings).
mode-class with value special, put on as
follows:
(put 'funny-mode 'mode-class 'special)
This tells Emacs that new buffers created while the current buffer is in
Funny mode should not be put in Funny mode, even though the default
value of major-mode is nil. By default, the value of
nil for major-mode means to use the current buffer’s major
mode when creating new buffers (see section How Emacs Chooses a Major Mode), but with such
special modes, Fundamental mode is used instead. Modes such as
Dired, Rmail, and Buffer List use this feature.
The function view-buffer does not enable View mode in buffers
whose mode-class is special, because such modes usually provide their
own View-like bindings.
The define-derived-mode macro automatically marks the derived
mode as special if the parent mode is special. Special mode is a
convenient parent for such modes to inherit from; See section Basic Major Modes.
auto-mode-alist to select
the mode for those file names (see section How Emacs Chooses a Major Mode). If you
define the mode command to autoload, you should add this element in
the same file that calls autoload. If you use an autoload
cookie for the mode command, you can also use an autoload cookie for
the form that adds the element (see autoload cookie). If you do
not autoload the mode command, it is sufficient to add the element in
the file that contains the mode definition.
defvar or defcustom to set mode-related
variables, so that they are not reinitialized if they already have a
value (see section Defining Global Variables).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When Emacs visits a file, it automatically selects a major mode for the buffer based on information in the file name or in the file itself. It also processes local variables specified in the file text.
This function establishes the proper major mode and buffer-local variable
bindings for the current buffer. First it calls set-auto-mode
(see below), then it runs hack-local-variables to parse, and
bind or evaluate as appropriate, the file’s local variables
(see section File Local Variables).
If the find-file argument to normal-mode is non-nil,
normal-mode assumes that the find-file function is calling
it. In this case, it may process local variables in the ‘-*-’
line or at the end of the file. The variable
enable-local-variables controls whether to do so. See Local Variables in Files in The GNU Emacs Manual,
for the syntax of the local variables section of a file.
If you run normal-mode interactively, the argument
find-file is normally nil. In this case,
normal-mode unconditionally processes any file local variables.
The function calls set-auto-mode to choose a major mode. If this
does not specify a mode, the buffer stays in the major mode determined
by the default value of major-mode (see below).
normal-mode uses condition-case around the call to the
major mode command, so errors are caught and reported as a ‘File
mode specification error’, followed by the original error message.
This function selects the major mode that is appropriate for the
current buffer. It bases its decision (in order of precedence) on the
‘-*-’ line, on any ‘mode:’ local variable near the end of
a file, on the ‘#!’ line (using interpreter-mode-alist),
on the text at the beginning of the buffer (using
magic-mode-alist), and finally on the visited file name (using
auto-mode-alist). See How Major Modes are
Chosen in The GNU Emacs Manual. If enable-local-variables
is nil, set-auto-mode does not check the ‘-*-’
line, or near the end of the file, for any mode tag.
There are some file types where it is not appropriate to scan the file
contents for a mode specifier. For example, a tar archive may happen to
contain, near the end of the file, a member file that has a local
variables section specifying a mode for that particular file. This
should not be applied to the containing tar file. Similarly, a tiff
image file might just happen to contain a first line that seems to
match the ‘-*-’ pattern. For these reasons, both these file
extensions are members of the list inhibit-local-variables-regexps.
Add patterns to this list to prevent Emacs searching them for local
variables of any kind (not just mode specifiers).
If keep-mode-if-same is non-nil, this function does not
call the mode command if the buffer is already in the proper major
mode. For instance, set-visited-file-name sets this to
t to avoid killing buffer local variables that the user may
have set.
This function sets the major mode of buffer to the default value of
major-mode; if that is nil, it uses the
current buffer’s major mode (if that is suitable). As an exception,
if buffer’s name is *scratch*, it sets the mode to
initial-major-mode.
The low-level primitives for creating buffers do not use this function,
but medium-level commands such as switch-to-buffer and
find-file-noselect use it whenever they create buffers.
The value of this variable determines the major mode of the initial
*scratch* buffer. The value should be a symbol that is a major
mode command. The default value is lisp-interaction-mode.
This variable specifies major modes to use for scripts that specify a
command interpreter in a ‘#!’ line. Its value is an alist with
elements of the form (regexp . mode); this says to
use mode mode if the file specifies an interpreter which matches
\\`regexp\\'. For example, one of the default elements
is ("python[0-9.]*" . python-mode).
This variable’s value is an alist with elements of the form
(regexp . function), where regexp is a
regular expression and function is a function or nil.
After visiting a file, set-auto-mode calls function if
the text at the beginning of the buffer matches regexp and
function is non-nil; if function is nil,
auto-mode-alist gets to decide the mode.
This works like magic-mode-alist, except that it is handled
only if auto-mode-alist does not specify a mode for this file.
This variable contains an association list of file name patterns
(regular expressions) and corresponding major mode commands. Usually,
the file name patterns test for suffixes, such as ‘.el’ and
‘.c’, but this need not be the case. An ordinary element of the
alist looks like (regexp . mode-function).
For example,
(("\\`/tmp/fol/" . text-mode)
("\\.texinfo\\'" . texinfo-mode)
("\\.texi\\'" . texinfo-mode)
("\\.el\\'" . emacs-lisp-mode)
("\\.c\\'" . c-mode)
("\\.h\\'" . c-mode)
…)
When you visit a file whose expanded file name (see section Functions that Expand Filenames), with version numbers and backup suffixes removed using
file-name-sans-versions (see section File Name Components), matches
a regexp, set-auto-mode calls the corresponding
mode-function. This feature enables Emacs to select the proper
major mode for most files.
If an element of auto-mode-alist has the form (regexp
function t), then after calling function, Emacs searches
auto-mode-alist again for a match against the portion of the file
name that did not match before. This feature is useful for
uncompression packages: an entry of the form ("\\.gz\\'"
function t) can uncompress the file and then put the uncompressed
file in the proper mode according to the name sans ‘.gz’.
Here is an example of how to prepend several pattern pairs to
auto-mode-alist. (You might use this sort of expression in your
init file.)
(setq auto-mode-alist (append ;; File name (within directory) starts with a dot. '(("/\\.[^/]*\\'" . fundamental-mode) ;; File name has no dot. ("/[^\\./]*\\'" . fundamental-mode) ;; File name ends in ‘.C’. ("\\.C\\'" . c++-mode)) auto-mode-alist))
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The describe-mode function provides information about major
modes. It is normally bound to C-h m. It uses the value of the
variable major-mode (see section Major Modes), which is why every
major mode command needs to set that variable.
This command displays the documentation of the current buffer’s major
mode and minor modes. It uses the documentation function to
retrieve the documentation strings of the major and minor mode
commands (see section Access to Documentation Strings).
If called from Lisp with a non-nil buffer argument, this
function displays the documentation for that buffer’s major and minor
modes, rather than those of the current buffer.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The recommended way to define a new major mode is to derive it from an
existing one using define-derived-mode. If there is no closely
related mode, you should inherit from either text-mode,
special-mode, or prog-mode. See section Basic Major Modes. If
none of these are suitable, you can inherit from fundamental-mode
(see section Major Modes).
This macro defines variant as a major mode command, using name as the string form of the mode name. variant and parent should be unquoted symbols.
The new command variant is defined to call the function parent, then override certain aspects of that parent mode:
variant-map. define-derived-mode
makes the parent mode’s keymap the parent of the new map, unless
variant-map is already set and already has a parent.
variant-syntax-table, unless you override this using the
:syntax-table keyword (see below). define-derived-mode
makes the parent mode’s syntax-table the parent of
variant-syntax-table, unless the latter is already set
and already has a parent different from the standard syntax table.
variant-abbrev-table, unless you override this using the
:abbrev-table keyword (see below).
variant-hook. It
runs this hook, after running the hooks of its ancestor modes, with
run-mode-hooks, as the last thing it does. See section Mode Hooks.
In addition, you can specify how to override other aspects of parent with body. The command variant evaluates the forms in body after setting up all its usual overrides, just before running the mode hooks.
If parent has a non-nil mode-class symbol
property, then define-derived-mode sets the mode-class
property of variant to the same value. This ensures, for
example, that if parent is a special mode, then variant is
also a special mode (see section Major Mode Conventions).
You can also specify nil for parent. This gives the new
mode no parent. Then define-derived-mode behaves as described
above, but, of course, omits all actions connected with parent.
The argument docstring specifies the documentation string for the
new mode. define-derived-mode adds some general information
about the mode’s hook, followed by the mode’s keymap, at the end of this
documentation string. If you omit docstring,
define-derived-mode generates a documentation string.
The keyword-args are pairs of keywords and values. The values are evaluated. The following keywords are currently supported:
:syntax-tableYou can use this to explicitly specify a syntax table for the new
mode. If you specify a nil value, the new mode uses the same
syntax table as parent, or the standard syntax table if
parent is nil. (Note that this does not follow
the convention used for non-keyword arguments that a nil value
is equivalent with not specifying the argument.)
:abbrev-tableYou can use this to explicitly specify an abbrev table for the new
mode. If you specify a nil value, the new mode uses the same
abbrev table as parent, or fundamental-mode-abbrev-table
if parent is nil. (Again, a nil value is
not equivalent to not specifying this keyword.)
:groupIf this is specified, the value should be the customization group for
this mode. (Not all major modes have one.) Only the (still
experimental and unadvertised) command customize-mode currently
uses this. define-derived-mode does not automatically
define the specified customization group.
Here is a hypothetical example:
(define-derived-mode hypertext-mode
text-mode "Hypertext"
"Major mode for hypertext.
\\{hypertext-mode-map}"
(setq case-fold-search nil))
(define-key hypertext-mode-map
[down-mouse-3] 'do-hyper-link)
Do not write an interactive spec in the definition;
define-derived-mode does that automatically.
This function returns non-nil if the current major mode is
derived from any of the major modes given by the symbols modes.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Apart from Fundamental mode, there are three major modes that other major modes commonly derive from: Text mode, Prog mode, and Special mode. While Text mode is useful in its own right (e.g., for editing files ending in .txt), Prog mode and Special mode exist mainly to let other modes derive from them.
As far as possible, new major modes should be derived, either directly
or indirectly, from one of these three modes. One reason is that this
allows users to customize a single mode hook
(e.g., prog-mode-hook) for an entire family of relevant modes
(e.g., all programming language modes).
Text mode is a major mode for editing human languages. It defines the
‘"’ and ‘\’ characters as having punctuation syntax
(see section Table of Syntax Classes), and binds M-TAB to
ispell-complete-word (see Spelling in The GNU Emacs
Manual).
An example of a major mode derived from Text mode is HTML mode. See SGML and HTML Modes in The GNU Emacs Manual.
Prog mode is a basic major mode for buffers containing programming language source code. Most of the programming language major modes built into Emacs are derived from it.
Prog mode binds parse-sexp-ignore-comments to t
(see section Motion Commands Based on Parsing) and bidi-paragraph-direction to
left-to-right (see section Bidirectional Display).
Special mode is a basic major mode for buffers containing text that is
produced specially by Emacs, rather than directly from a file. Major
modes derived from Special mode are given a mode-class property
of special (see section Major Mode Conventions).
Special mode sets the buffer to read-only. Its keymap defines several
common bindings, including q for quit-window and g
for revert-buffer (see section Reverting).
An example of a major mode derived from Special mode is Buffer Menu mode, which is used by the *Buffer List* buffer. See Listing Existing Buffers in The GNU Emacs Manual.
In addition, modes for buffers of tabulated data can inherit from Tabulated List mode, which is in turn derived from Special mode. See section Tabulated List mode.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Every major mode command should finish by running the mode-independent
normal hook change-major-mode-after-body-hook, its mode hook,
and the normal hook after-change-major-mode-hook.
It does this by calling run-mode-hooks. If the major mode is a
derived mode, that is if it calls another major mode (the parent mode)
in its body, it should do this inside delay-mode-hooks so that
the parent won’t run these hooks itself. Instead, the derived mode’s
call to run-mode-hooks runs the parent’s mode hook too.
See section Major Mode Conventions.
Emacs versions before Emacs 22 did not have delay-mode-hooks.
Versions before 24 did not have change-major-mode-after-body-hook.
When user-implemented major modes do not use run-mode-hooks and
have not been updated to use these newer features, they won’t entirely
follow these conventions: they may run the parent’s mode hook too early,
or fail to run after-change-major-mode-hook. If you encounter
such a major mode, please correct it to follow these conventions.
When you defined a major mode using define-derived-mode, it
automatically makes sure these conventions are followed. If you
define a major mode “by hand”, not using define-derived-mode,
use the following functions to handle these conventions automatically.
Major modes should run their mode hook using this function. It is
similar to run-hooks (see section Hooks), but it also runs
change-major-mode-after-body-hook and
after-change-major-mode-hook.
When this function is called during the execution of a
delay-mode-hooks form, it does not run the hooks immediately.
Instead, it arranges for the next call to run-mode-hooks to run
them.
When one major mode command calls another, it should do so inside of
delay-mode-hooks.
This macro executes body, but tells all run-mode-hooks
calls during the execution of body to delay running their hooks.
The hooks will actually run during the next call to
run-mode-hooks after the end of the delay-mode-hooks
construct.
This is a normal hook run by run-mode-hooks. It is run before
the mode hooks.
This is a normal hook run by run-mode-hooks. It is run at the
very end of every properly-written major mode command.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Tabulated List mode is a major mode for displaying tabulated data, i.e., data consisting of entries, each entry occupying one row of text with its contents divided into columns. Tabulated List mode provides facilities for pretty-printing rows and columns, and sorting the rows according to the values in each column. It is derived from Special mode (see section Basic Major Modes).
Tabulated List mode is intended to be used as a parent mode by a more specialized major mode. Examples include Process Menu mode (see section Process Information) and Package Menu mode (see Package Menu in The GNU Emacs Manual).
Such a derived mode should use define-derived-mode in the usual
way, specifying tabulated-list-mode as the second argument
(see section Defining Derived Modes). The body of the define-derived-mode
form should specify the format of the tabulated data, by assigning
values to the variables documented below; then, it should call the
function tabulated-list-init-header to initialize the header
line.
The derived mode should also define a listing command. This,
not the mode command, is what the user calls (e.g., M-x
list-processes). The listing command should create or switch to a
buffer, turn on the derived mode, specify the tabulated data, and
finally call tabulated-list-print to populate the buffer.
This buffer-local variable specifies the format of the Tabulated List
data. Its value should be a vector. Each element of the vector
represents a data column, and should be a list (name
width sort), where
nil,
the column cannot be used for sorting. If t, the column is
sorted by comparing string values. Otherwise, this should be a
predicate function for sort (see section Functions that Rearrange Lists), which
accepts two arguments with the same form as the elements of
tabulated-list-entries (see below).
This buffer-local variable specifies the entries displayed in the Tabulated List buffer. Its value should be either a list, or a function.
If the value is a list, each list element corresponds to one entry, and
should have the form (id contents), where
nil, or a Lisp object that identifies the
entry. If the latter, the cursor stays on the “same” entry when
re-sorting entries. Comparison is done with equal.
tabulated-list-format. Each vector element is either a string,
which is inserted into the buffer as-is, or a list (label
. properties), which means to insert a text button by calling
insert-text-button with label and properties as
arguments (see section Making Buttons).
There should be no newlines in any of these strings.
Otherwise, the value should be a function which returns a list of the above form when called with no arguments.
This normal hook is run prior to reverting a Tabulated List buffer. A
derived mode can add a function to this hook to recompute
tabulated-list-entries.
The value of this variable is the function called to insert an entry at
point, including its terminating newline. The function should accept
two arguments, id and contents, having the same meanings as
in tabulated-list-entries. The default value is a function which
inserts an entry in a straightforward way; a mode which uses Tabulated
List mode in a more complex way can specify another function.
The value of this variable specifies the current sort key for the
Tabulated List buffer. If it is nil, no sorting is done.
Otherwise, it should have the form (name . flip),
where name is a string matching one of the column names in
tabulated-list-format, and flip, if non-nil, means
to invert the sort order.
This function computes and sets header-line-format for the
Tabulated List buffer (see section Window Header Lines), and assigns a keymap to
the header line to allow sort entries by clicking on column headers.
Modes derived from Tabulated List mode should call this after setting
the above variables (in particular, only after setting
tabulated-list-format).
This function populates the current buffer with entries. It should be
called by the listing command. It erases the buffer, sorts the entries
specified by tabulated-list-entries according to
tabulated-list-sort-key, then calls the function specified by
tabulated-list-printer to insert each entry.
If the optional argument remember-pos is non-nil, this
function looks for the id element on the current line, if any, and
tries to move to that entry after all the entries are (re)inserted.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Generic modes are simple major modes with basic support for
comment syntax and Font Lock mode. To define a generic mode, use the
macro define-generic-mode. See the file generic-x.el
for some examples of the use of define-generic-mode.
This macro defines a generic mode command named mode (a symbol,
not quoted). The optional argument docstring is the
documentation for the mode command. If you do not supply it,
define-generic-mode generates one by default.
The argument comment-list is a list in which each element is
either a character, a string of one or two characters, or a cons cell.
A character or a string is set up in the mode’s syntax table as a
“comment starter”. If the entry is a cons cell, the CAR is set
up as a “comment starter” and the CDR as a “comment ender”.
(Use nil for the latter if you want comments to end at the end
of the line.) Note that the syntax table mechanism has limitations
about what comment starters and enders are actually possible.
See section Syntax Tables.
The argument keyword-list is a list of keywords to highlight
with font-lock-keyword-face. Each keyword should be a string.
Meanwhile, font-lock-list is a list of additional expressions to
highlight. Each element of this list should have the same form as an
element of font-lock-keywords. See section Search-based Fontification.
The argument auto-mode-list is a list of regular expressions to
add to the variable auto-mode-alist. They are added by the execution
of the define-generic-mode form, not by expanding the macro call.
Finally, function-list is a list of functions for the mode
command to call for additional setup. It calls these functions just
before it runs the mode hook variable mode-hook.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Text mode is perhaps the simplest mode besides Fundamental mode. Here are excerpts from text-mode.el that illustrate many of the conventions listed above:
;; Create the syntax table for this mode.
(defvar text-mode-syntax-table
(let ((st (make-syntax-table)))
(modify-syntax-entry ?\" ". " st)
(modify-syntax-entry ?\\ ". " st)
;; Add `p' so M-c on `hello' leads to `Hello', not `hello'.
(modify-syntax-entry ?' "w p" st)
st)
"Syntax table used while in `text-mode'.")
;; Create the keymap for this mode.
(defvar text-mode-map
(let ((map (make-sparse-keymap)))
(define-key map "\e\t" 'ispell-complete-word)
map)
"Keymap for `text-mode'.
Many other modes, such as `mail-mode', `outline-mode' and
`indented-text-mode', inherit all the commands defined in this map.")
Here is how the actual mode command is defined now:
(define-derived-mode text-mode nil "Text"
"Major mode for editing text written for humans to read.
In this mode, paragraphs are delimited only by blank or white lines.
You can thus get the full benefit of adaptive filling
(see the variable `adaptive-fill-mode').
\\{text-mode-map}
Turning on Text mode runs the normal hook `text-mode-hook'."
(set (make-local-variable 'text-mode-variant) t)
(set (make-local-variable 'require-final-newline)
mode-require-final-newline)
(set (make-local-variable 'indent-line-function) 'indent-relative))
(The last line is redundant nowadays, since indent-relative is
the default value, and we’ll delete it in a future version.)
The three Lisp modes (Lisp mode, Emacs Lisp mode, and Lisp Interaction mode) have more features than Text mode and the code is correspondingly more complicated. Here are excerpts from lisp-mode.el that illustrate how these modes are written.
Here is how the Lisp mode syntax and abbrev tables are defined:
;; Create mode-specific table variables.
(defvar lisp-mode-abbrev-table nil)
(define-abbrev-table 'lisp-mode-abbrev-table ())
(defvar lisp-mode-syntax-table
(let ((table (copy-syntax-table emacs-lisp-mode-syntax-table)))
(modify-syntax-entry ?\[ "_ " table)
(modify-syntax-entry ?\] "_ " table)
(modify-syntax-entry ?# "' 14" table)
(modify-syntax-entry ?| "\" 23bn" table)
table)
"Syntax table used in `lisp-mode'.")
The three modes for Lisp share much of their code. For instance, each calls the following function to set various variables:
(defun lisp-mode-variables (&optional syntax keywords-case-insensitive)
(when syntax
(set-syntax-table lisp-mode-syntax-table))
(setq local-abbrev-table lisp-mode-abbrev-table)
…
Amongst other things, this function sets up the comment-start
variable to handle Lisp comments:
(make-local-variable 'comment-start) (setq comment-start ";") …
Each of the different Lisp modes has a slightly different keymap. For
example, Lisp mode binds C-c C-z to run-lisp, but the other
Lisp modes do not. However, all Lisp modes have some commands in
common. The following code sets up the common commands:
(defvar lisp-mode-shared-map
(let ((map (make-sparse-keymap)))
(define-key map "\e\C-q" 'indent-sexp)
(define-key map "\177" 'backward-delete-char-untabify)
map)
"Keymap for commands shared by all sorts of Lisp modes.")
And here is the code to set up the keymap for Lisp mode:
(defvar lisp-mode-map
(let ((map (make-sparse-keymap))
(menu-map (make-sparse-keymap "Lisp")))
(set-keymap-parent map lisp-mode-shared-map)
(define-key map "\e\C-x" 'lisp-eval-defun)
(define-key map "\C-c\C-z" 'run-lisp)
…
map)
"Keymap for ordinary Lisp mode.
All commands in `lisp-mode-shared-map' are inherited by this map.")
Finally, here is the major mode command for Lisp mode:
(define-derived-mode lisp-mode prog-mode "Lisp"
"Major mode for editing Lisp code for Lisps other than GNU Emacs Lisp.
Commands:
Delete converts tabs to spaces as it moves back.
Blank lines separate paragraphs. Semicolons start comments.
\\{lisp-mode-map}
Note that `run-lisp' may be used either to start an inferior Lisp job
or to switch back to an existing one.
Entry to this mode calls the value of `lisp-mode-hook'
if that value is non-nil."
(lisp-mode-variables nil t)
(set (make-local-variable 'find-tag-default-function)
'lisp-find-tag-default)
(set (make-local-variable 'comment-start-skip)
"\\(\\(^\\|[^\\\\\n]\\)\\(\\\\\\\\\\)*\\)\\(;+\\|#|\\) *")
(setq imenu-case-fold-search t))
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A minor mode provides optional features that users may enable or disable independently of the choice of major mode. Minor modes can be enabled individually or in combination.
Most minor modes implement features that are independent of the major mode, and can thus be used with most major modes. For example, Auto Fill mode works with any major mode that permits text insertion. A few minor modes, however, are specific to a particular major mode. For example, Diff Auto Refine mode is a minor mode that is intended to be used only with Diff mode.
Ideally, a minor mode should have its desired effect regardless of the other minor modes in effect. It should be possible to activate and deactivate minor modes in any order.
The value of this variable is a list of all minor mode commands.
| 22.3.1 Conventions for Writing Minor Modes | Tips for writing a minor mode. | |
| 22.3.2 Keymaps and Minor Modes | How a minor mode can have its own keymap. | |
| 22.3.3 Defining Minor Modes | A convenient facility for defining minor modes. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
There are conventions for writing minor modes just as there are for
major modes. These conventions are described below. The easiest way to
follow them is to use the macro define-minor-mode.
See section Defining Minor Modes.
nil if the mode is disabled, and non-nil
if the mode is enabled. The variable should be buffer-local if the
minor mode is buffer-local.
This variable is used in conjunction with the minor-mode-alist to
display the minor mode name in the mode line. It also determines
whether the minor mode keymap is active, via minor-mode-map-alist
(see section Controlling the Active Keymaps). Individual commands or hooks can
also check its value.
The mode command should accept one optional argument. If called interactively with no prefix argument, it should toggle the mode (i.e., enable if it is disabled, and disable if it is enabled). If called interactively with a prefix argument, it should enable the mode if the argument is positive and disable it otherwise.
If the mode command is called from Lisp (i.e., non-interactively), it
should enable the mode if the argument is omitted or nil; it
should toggle the mode if the argument is the symbol toggle;
otherwise it should treat the argument in the same way as for an
interactive call with a numeric prefix argument, as described above.
The following example shows how to implement this behavior (it is
similar to the code generated by the define-minor-mode macro):
(interactive (list (or current-prefix-arg 'toggle)))
(let ((enable (if (eq arg 'toggle)
(not foo-mode) ; this mode’s mode variable
(> (prefix-numeric-value arg) 0))))
(if enable
do-enable
do-disable))
The reason for this somewhat complex behavior is that it lets users easily toggle the minor mode interactively, and also lets the minor mode be easily enabled in a mode hook, like this:
(add-hook 'text-mode-hook 'foo-mode)
This behaves correctly whether or not foo-mode was already
enabled, since the foo-mode mode command unconditionally enables
the minor mode when it is called from Lisp with no argument. Disabling
a minor mode in a mode hook is a little uglier:
(add-hook 'text-mode-hook (lambda () (foo-mode -1)))
However, this is not very commonly done.
minor-mode-alist for each minor mode
(see Definition of minor-mode-alist), if you want to indicate the
minor mode in the mode line. This element should be a list of the
following form:
(mode-variable string)
Here mode-variable is the variable that controls enabling of the minor mode, and string is a short string, starting with a space, to represent the mode in the mode line. These strings must be short so that there is room for several of them at once.
When you add an element to minor-mode-alist, use assq to
check for an existing element, to avoid duplication. For example:
(unless (assq 'leif-mode minor-mode-alist) (push '(leif-mode " Leif") minor-mode-alist))
or like this, using add-to-list (see section Modifying List Variables):
(add-to-list 'minor-mode-alist '(leif-mode " Leif"))
In addition, several major mode conventions apply to minor modes as well: those regarding the names of global symbols, the use of a hook at the end of the initialization function, and the use of keymaps and other tables.
The minor mode should, if possible, support enabling and disabling via
Custom (see section Customization Settings). To do this, the mode variable should be
defined with defcustom, usually with :type 'boolean. If
just setting the variable is not sufficient to enable the mode, you
should also specify a :set method which enables the mode by
invoking the mode command. Note in the variable’s documentation string
that setting the variable other than via Custom may not take effect.
Also, mark the definition with an autoload cookie (see autoload cookie), and specify a :require so that customizing the variable
will load the library that defines the mode. For example:
;;;###autoload (defcustom msb-mode nil "Toggle msb-mode. Setting this variable directly does not take effect; use either \\[customize] or the function `msb-mode'." :set 'custom-set-minor-mode :initialize 'custom-initialize-default :version "20.4" :type 'boolean :group 'msb :require 'msb)
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Each minor mode can have its own keymap, which is active when the mode
is enabled. To set up a keymap for a minor mode, add an element to the
alist minor-mode-map-alist. See Definition of minor-mode-map-alist.
One use of minor mode keymaps is to modify the behavior of certain
self-inserting characters so that they do something else as well as
self-insert. (Another way to customize self-insert-command is
through post-self-insert-hook. Apart from this, the facilities
for customizing self-insert-command are limited to special cases,
designed for abbrevs and Auto Fill mode. Do not try substituting your
own definition of self-insert-command for the standard one. The
editor command loop handles this function specially.)
Minor modes may bind commands to key sequences consisting of C-c followed by a punctuation character. However, sequences consisting of C-c followed by one of {}<>:;, or a control character or digit, are reserved for major modes. Also, C-c letter is reserved for users. See section Key Binding Conventions.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The macro define-minor-mode offers a convenient way of
implementing a mode in one self-contained definition.
This macro defines a new minor mode whose name is mode (a symbol). It defines a command named mode to toggle the minor mode, with doc as its documentation string.
The toggle command takes one optional (prefix) argument.
If called interactively with no argument it toggles the mode on or off.
A positive prefix argument enables the mode, any other prefix argument
disables it. From Lisp, an argument of toggle toggles the mode,
whereas an omitted or nil argument enables the mode.
This makes it easy to enable the minor mode in a major mode hook, for example.
If doc is nil, the macro supplies a default documentation string
explaining the above.
By default, it also defines a variable named mode, which is set to
t or nil by enabling or disabling the mode. The variable
is initialized to init-value. Except in unusual circumstances
(see below), this value must be nil.
The string lighter says what to display in the mode line
when the mode is enabled; if it is nil, the mode is not displayed
in the mode line.
The optional argument keymap specifies the keymap for the minor
mode. If non-nil, it should be a variable name (whose value is
a keymap), a keymap, or an alist of the form
(key-sequence . definition)
where each key-sequence and definition are arguments
suitable for passing to define-key (see section Changing Key Bindings). If keymap is a keymap or an alist, this also
defines the variable mode-map.
The above three arguments init-value, lighter, and keymap can be (partially) omitted when keyword-args are used. The keyword-args consist of keywords followed by corresponding values. A few keywords have special meanings:
:group groupCustom group name to use in all generated defcustom forms.
Defaults to mode without the possible trailing ‘-mode’.
Warning: don’t use this default group name unless you have
written a defgroup to define that group properly. See section Defining Customization Groups.
:global globalIf non-nil, this specifies that the minor mode should be global
rather than buffer-local. It defaults to nil.
One of the effects of making a minor mode global is that the
mode variable becomes a customization variable. Toggling it
through the Customize interface turns the mode on and off, and its
value can be saved for future Emacs sessions (see Saving
Customizations in The GNU Emacs Manual. For the saved
variable to work, you should ensure that the define-minor-mode
form is evaluated each time Emacs starts; for packages that are not
part of Emacs, the easiest way to do this is to specify a
:require keyword.
:init-value init-valueThis is equivalent to specifying init-value positionally.
:lighter lighterThis is equivalent to specifying lighter positionally.
:keymap keymapThis is equivalent to specifying keymap positionally.
:variable placeThis replaces the default variable mode, used to store the state
of the mode. If you specify this, the mode variable is not
defined, and any init-value argument is unused. place
can be a different named variable (which you must define yourself), or
anything that can be used with the setf function
(see section Generalized Variables).
place can also be a cons (get . set),
where get is an expression that returns the current state,
and set is a function of one argument (a state) that sets it.
:after-hook after-hookThis defines a single Lisp form which is evaluated after the mode hooks have run. It should not be quoted.
Any other keyword arguments are passed directly to the
defcustom generated for the variable mode.
The command named mode first performs the standard actions such as
setting the variable named mode and then executes the body
forms, if any. It then runs the mode hook variable
mode-hook and finishes by evaluating any form in
:after-hook.
The initial value must be nil except in cases where (1) the
mode is preloaded in Emacs, or (2) it is painless for loading to
enable the mode even though the user did not request it. For
instance, if the mode has no effect unless something else is enabled,
and will always be loaded by that time, enabling it by default is
harmless. But these are unusual circumstances. Normally, the
initial value must be nil.
The name easy-mmode-define-minor-mode is an alias
for this macro.
Here is an example of using define-minor-mode:
(define-minor-mode hungry-mode "Toggle Hungry mode. Interactively with no argument, this command toggles the mode. A positive prefix argument enables the mode, any other prefix argument disables it. From Lisp, argument omitted or nil enables the mode, `toggle' toggles the state. When Hungry mode is enabled, the control delete key gobbles all preceding whitespace except the last. See the command \\[hungry-electric-delete]." ;; The initial value. nil ;; The indicator for the mode line. " Hungry" ;; The minor mode bindings. '(([C-backspace] . hungry-electric-delete)) :group 'hunger)
This defines a minor mode named “Hungry mode”, a command named
hungry-mode to toggle it, a variable named hungry-mode
which indicates whether the mode is enabled, and a variable named
hungry-mode-map which holds the keymap that is active when the
mode is enabled. It initializes the keymap with a key binding for
C-DEL. It puts the variable hungry-mode into
custom group hunger. There are no body forms—many
minor modes don’t need any.
Here’s an equivalent way to write it:
(define-minor-mode hungry-mode
"Toggle Hungry mode.
...rest of documentation as before..."
;; The initial value.
:init-value nil
;; The indicator for the mode line.
:lighter " Hungry"
;; The minor mode bindings.
:keymap
'(([C-backspace] . hungry-electric-delete)
([C-M-backspace]
. (lambda ()
(interactive)
(hungry-electric-delete t))))
:group 'hunger)
This defines a global toggle named global-mode whose meaning is to enable or disable the buffer-local minor mode mode in all buffers. To turn on the minor mode in a buffer, it uses the function turn-on; to turn off the minor mode, it calls mode with -1 as argument.
Globally enabling the mode also affects buffers subsequently created by visiting files, and buffers that use a major mode other than Fundamental mode; but it does not detect the creation of a new buffer in Fundamental mode.
This defines the customization option global-mode (see section Customization Settings),
which can be toggled in the Customize interface to turn the minor mode on
and off. As with define-minor-mode, you should ensure that the
define-globalized-minor-mode form is evaluated each time Emacs
starts, for example by providing a :require keyword.
Use :group group in keyword-args to specify the
custom group for the mode variable of the global minor mode.
Generally speaking, when you define a globalized minor mode, you should also define a non-globalized version, so that people can use (or disable) it in individual buffers. This also allows them to disable a globally enabled minor mode in a specific major mode, by using that mode’s hook.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Each Emacs window (aside from minibuffer windows) typically has a mode line at the bottom, which displays status information about the buffer displayed in the window. The mode line contains information about the buffer, such as its name, associated file, depth of recursive editing, and major and minor modes. A window can also have a header line, which is much like the mode line but appears at the top of the window.
This section describes how to control the contents of the mode line and header line. We include it in this chapter because much of the information displayed in the mode line relates to the enabled major and minor modes.
| 22.4.1 Mode Line Basics | Basic ideas of mode line control. | |
| 22.4.2 The Data Structure of the Mode Line | The data structure that controls the mode line. | |
| 22.4.3 The Top Level of Mode Line Control | The top level variable, mode-line-format. | |
| 22.4.4 Variables Used in the Mode Line | Variables used in that data structure. | |
22.4.5 %-Constructs in the Mode Line | Putting information into a mode line. | |
| 22.4.6 Properties in the Mode Line | Using text properties in the mode line. | |
| 22.4.7 Window Header Lines | Like a mode line, but at the top. | |
| 22.4.8 Emulating Mode Line Formatting | Formatting text as the mode line would. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The contents of each mode line are specified by the buffer-local
variable mode-line-format (see section The Top Level of Mode Line Control). This variable
holds a mode line construct: a template that controls what is
displayed on the buffer’s mode line. The value of
header-line-format specifies the buffer’s header line in the same
way. All windows for the same buffer use the same
mode-line-format and header-line-format.
For efficiency, Emacs does not continuously recompute each window’s
mode line and header line. It does so when circumstances appear to call
for it—for instance, if you change the window configuration, switch
buffers, narrow or widen the buffer, scroll, or modify the buffer. If
you alter any of the variables referenced by mode-line-format or
header-line-format (see section Variables Used in the Mode Line), or any other
data structures that affect how text is displayed (see section Emacs Display), you
should use the function force-mode-line-update to update the
display.
This function forces Emacs to update the current buffer’s mode line and
header line, based on the latest values of all relevant variables,
during its next redisplay cycle. If the optional argument all is
non-nil, it forces an update for all mode lines and header lines.
This function also forces an update of the menu bar and frame title.
The selected window’s mode line is usually displayed in a different
color using the face mode-line. Other windows’ mode lines appear
in the face mode-line-inactive instead. See section Faces.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The mode line contents are controlled by a data structure called a mode line construct, made up of lists, strings, symbols, and numbers kept in buffer-local variables. Each data type has a specific meaning for the mode line appearance, as described below. The same data structure is used for constructing frame titles (see section Frame Titles) and header lines (see section Window Header Lines).
A mode line construct may be as simple as a fixed string of text, but it usually specifies how to combine fixed strings with variables’ values to construct the text. Many of these variables are themselves defined to have mode line constructs as their values.
Here are the meanings of various data types as mode line constructs:
stringA string as a mode line construct appears verbatim except for
%-constructs in it. These stand for substitution of
other data; see %-Constructs in the Mode Line.
If parts of the string have face properties, they control
display of the text just as they would text in the buffer. Any
characters which have no face properties are displayed, by
default, in the face mode-line or mode-line-inactive
(see Standard Faces in The GNU Emacs Manual). The
help-echo and keymap properties in string have
special meanings. See section Properties in the Mode Line.
symbolA symbol as a mode line construct stands for its value. The value of
symbol is used as a mode line construct, in place of symbol.
However, the symbols t and nil are ignored, as is any
symbol whose value is void.
There is one exception: if the value of symbol is a string, it is
displayed verbatim: the %-constructs are not recognized.
Unless symbol is marked as “risky” (i.e., it has a
non-nil risky-local-variable property), all text
properties specified in symbol’s value are ignored. This includes
the text properties of strings in symbol’s value, as well as all
:eval and :propertize forms in it. (The reason for this
is security: non-risky variables could be set automatically from file
variables without prompting the user.)
(string rest…)(list rest…)A list whose first element is a string or list means to process all the elements recursively and concatenate the results. This is the most common form of mode line construct.
(:eval form)A list whose first element is the symbol :eval says to evaluate
form, and use the result as a string to display. Make sure this
evaluation cannot load any files, as doing so could cause infinite
recursion.
(:propertize elt props…)A list whose first element is the symbol :propertize says to
process the mode line construct elt recursively, then add the text
properties specified by props to the result. The argument
props should consist of zero or more pairs text-property
value.
(symbol then else)A list whose first element is a symbol that is not a keyword specifies
a conditional. Its meaning depends on the value of symbol. If
symbol has a non-nil value, the second element,
then, is processed recursively as a mode line construct.
Otherwise, the third element, else, is processed recursively.
You may omit else; then the mode line construct displays nothing
if the value of symbol is nil or void.
(width rest…)A list whose first element is an integer specifies truncation or padding of the results of rest. The remaining elements rest are processed recursively as mode line constructs and concatenated together. When width is positive, the result is space filled on the right if its width is less than width. When width is negative, the result is truncated on the right to -width columns if its width exceeds -width.
For example, the usual way to show what percentage of a buffer is above
the top of the window is to use a list like this: (-3 "%p").
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The variable in overall control of the mode line is
mode-line-format.
The value of this variable is a mode line construct that controls the contents of the mode-line. It is always buffer-local in all buffers.
If you set this variable to nil in a buffer, that buffer does not
have a mode line. (A window that is just one line tall also does not
display a mode line.)
The default value of mode-line-format is designed to use the
values of other variables such as mode-line-position and
mode-line-modes (which in turn incorporates the values of the
variables mode-name and minor-mode-alist). Very few
modes need to alter mode-line-format itself. For most
purposes, it is sufficient to alter some of the variables that
mode-line-format either directly or indirectly refers to.
If you do alter mode-line-format itself, the new value should
use the same variables that appear in the default value (see section Variables Used in the Mode Line), rather than duplicating their contents or displaying
the information in another fashion. This way, customizations made by
the user or by Lisp programs (such as display-time and major
modes) via changes to those variables remain effective.
Here is a hypothetical example of a mode-line-format that might
be useful for Shell mode (in reality, Shell mode does not set
mode-line-format):
(setq mode-line-format (list "-" 'mode-line-mule-info 'mode-line-modified 'mode-line-frame-identification "%b--"
;; Note that this is evaluated while making the list. ;; It makes a mode line construct which is just a string. (getenv "HOST")
":"
'default-directory
" "
'global-mode-string
" %[("
'(:eval (mode-line-mode-name))
'mode-line-process
'minor-mode-alist
"%n"
")%]--"
'(which-func-mode ("" which-func-format "--"))
'(line-number-mode "L%l--")
'(column-number-mode "C%c--")
'(-3 "%p")))
(The variables line-number-mode, column-number-mode
and which-func-mode enable particular minor modes; as usual,
these variable names are also the minor mode command names.)
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes variables incorporated by the standard value of
mode-line-format into the text of the mode line. There is
nothing inherently special about these variables; any other variables
could have the same effects on the mode line if the value of
mode-line-format is changed to use them. However, various parts
of Emacs set these variables on the understanding that they will control
parts of the mode line; therefore, practically speaking, it is essential
for the mode line to use them.
This variable holds the value of the mode line construct that displays information about the language environment, buffer coding system, and current input method. See section Non-ASCII Characters.
This variable holds the value of the mode line construct that displays whether the current buffer is modified. Its default value displays ‘**’ if the buffer is modified, ‘--’ if the buffer is not modified, ‘%%’ if the buffer is read only, and ‘%*’ if the buffer is read only and modified.
Changing this variable does not force an update of the mode line.
This variable identifies the current frame. Its default value
displays " " if you are using a window system which can show
multiple frames, or "-%F " on an ordinary terminal which shows
only one frame at a time.
This variable identifies the buffer being displayed in the window. Its default value displays the buffer name, padded with spaces to at least 12 columns.
This variable indicates the position in the buffer. Its default value displays the buffer percentage and, optionally, the buffer size, the line number and the column number.
The variable vc-mode, buffer-local in each buffer, records
whether the buffer’s visited file is maintained with version control,
and, if so, which kind. Its value is a string that appears in the mode
line, or nil for no version control.
This variable displays the buffer’s major and minor modes. Its default value also displays the recursive editing level, information on the process status, and whether narrowing is in effect.
This variable is used to show whether default-directory for the
current buffer is remote.
This variable is used to identify emacsclient frames.
The following three variables are used in mode-line-modes:
This buffer-local variable holds the “pretty” name of the current
buffer’s major mode. Each major mode should set this variable so that
the mode name will appear in the mode line. The value does not have
to be a string, but can use any of the data types valid in a mode-line
construct (see section The Data Structure of the Mode Line). To compute the string that will
identify the mode name in the mode line, use format-mode-line
(see section Emulating Mode Line Formatting).
This buffer-local variable contains the mode line information on process
status in modes used for communicating with subprocesses. It is
displayed immediately following the major mode name, with no intervening
space. For example, its value in the *shell* buffer is
(":%s"), which allows the shell to display its status along
with the major mode as: ‘(Shell:run)’. Normally this variable
is nil.
This variable holds an association list whose elements specify how the
mode line should indicate that a minor mode is active. Each element of
the minor-mode-alist should be a two-element list:
(minor-mode-variable mode-line-string)
More generally, mode-line-string can be any mode line construct.
It appears in the mode line when the value of minor-mode-variable
is non-nil, and not otherwise. These strings should begin with
spaces so that they don’t run together. Conventionally, the
minor-mode-variable for a specific mode is set to a non-nil
value when that minor mode is activated.
minor-mode-alist itself is not buffer-local. Each variable
mentioned in the alist should be buffer-local if its minor mode can be
enabled separately in each buffer.
This variable holds a mode line construct that, by default, appears in
the mode line just after the which-func-mode minor mode if set,
else after mode-line-modes. The command display-time sets
global-mode-string to refer to the variable
display-time-string, which holds a string containing the time and
load information.
The ‘%M’ construct substitutes the value of
global-mode-string, but that is obsolete, since the variable is
included in the mode line from mode-line-format.
Here is a simplified version of the default value of
mode-line-format. The real default value also
specifies addition of text properties.
("-"
mode-line-mule-info
mode-line-modified
mode-line-frame-identification
mode-line-buffer-identification
" " mode-line-position (vc-mode vc-mode) " "
mode-line-modes
(which-func-mode ("" which-func-format "--"))
(global-mode-string ("--" global-mode-string))
"-%-")
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
%-Constructs in the Mode LineStrings used as mode line constructs can use certain
%-constructs to substitute various kinds of data. The
following is a list of the defined %-constructs, and what they
mean.
In any construct except ‘%%’, you can add a decimal integer after the ‘%’ to specify a minimum field width. If the width is less, the field is padded to that width. Purely numeric constructs (‘c’, ‘i’, ‘I’, and ‘l’) are padded by inserting spaces to the left, and others are padded by inserting spaces to the right.
%bThe current buffer name, obtained with the buffer-name function.
See section Buffer Names.
%cThe current column number of point.
%eWhen Emacs is nearly out of memory for Lisp objects, a brief message saying so. Otherwise, this is empty.
%fThe visited file name, obtained with the buffer-file-name
function. See section Buffer File Name.
%FThe title (only on a window system) or the name of the selected frame. See section Basic Parameters.
%iThe size of the accessible part of the current buffer; basically
(- (point-max) (point-min)).
%ILike ‘%i’, but the size is printed in a more readable way by using ‘k’ for 10^3, ‘M’ for 10^6, ‘G’ for 10^9, etc., to abbreviate.
%lThe current line number of point, counting within the accessible portion of the buffer.
%n‘Narrow’ when narrowing is in effect; nothing otherwise (see
narrow-to-region in Narrowing).
%pThe percentage of the buffer text above the top of window, or ‘Top’, ‘Bottom’ or ‘All’. Note that the default mode line construct truncates this to three characters.
%PThe percentage of the buffer text that is above the bottom of the window (which includes the text visible in the window, as well as the text above the top), plus ‘Top’ if the top of the buffer is visible on screen; or ‘Bottom’ or ‘All’.
%sThe status of the subprocess belonging to the current buffer, obtained with
process-status. See section Process Information.
%zThe mnemonics of keyboard, terminal, and buffer coding systems.
%ZLike ‘%z’, but including the end-of-line format.
%*‘%’ if the buffer is read only (see buffer-read-only);
‘*’ if the buffer is modified (see buffer-modified-p);
‘-’ otherwise. See section Buffer Modification.
%+‘*’ if the buffer is modified (see buffer-modified-p);
‘%’ if the buffer is read only (see buffer-read-only);
‘-’ otherwise. This differs from ‘%*’ only for a modified
read-only buffer. See section Buffer Modification.
%&‘*’ if the buffer is modified, and ‘-’ otherwise.
%[An indication of the depth of recursive editing levels (not counting minibuffer levels): one ‘[’ for each editing level. See section Recursive Editing.
%]One ‘]’ for each recursive editing level (not counting minibuffer levels).
%-Dashes sufficient to fill the remainder of the mode line.
%%The character ‘%’—this is how to include a literal ‘%’ in a
string in which %-constructs are allowed.
The following two %-constructs are still supported, but they are
obsolete, since you can get the same results with the variables
mode-name and global-mode-string.
%mThe value of mode-name.
%MThe value of global-mode-string.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Certain text properties are meaningful in the
mode line. The face property affects the appearance of text; the
help-echo property associates help strings with the text, and
keymap can make the text mouse-sensitive.
There are four ways to specify text properties for text in the mode line:
(:propertize elt props…) construct to
give elt a text property specified by props.
:eval form in the mode line data
structure, and make form evaluate to a string that has a text
property.
You can use the keymap property to specify a keymap. This
keymap only takes real effect for mouse clicks; binding character keys
and function keys to it has no effect, since it is impossible to move
point into the mode line.
When the mode line refers to a variable which does not have a
non-nil risky-local-variable property, any text
properties given or specified within that variable’s values are
ignored. This is because such properties could otherwise specify
functions to be called, and those functions could come from file
local variables.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A window can have a header line at the top, just as it can have
a mode line at the bottom. The header line feature works just like the
mode line feature, except that it’s controlled by
header-line-format:
This variable, local in every buffer, specifies how to display the
header line, for windows displaying the buffer. The format of the value
is the same as for mode-line-format (see section The Data Structure of the Mode Line).
It is normally nil, so that ordinary buffers have no header line.
This function returns the height in pixels of window’s header line. window must be a live window, and defaults to the selected window.
A window that is just one line tall never displays a header line. A window that is two lines tall cannot display both a mode line and a header line at once; if it has a mode line, then it does not display a header line.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can use the function format-mode-line to compute the text
that would appear in a mode line or header line based on a certain
mode line construct.
This function formats a line of text according to format as if it
were generating the mode line for window, but it also returns the
text as a string. The argument window defaults to the selected
window. If buffer is non-nil, all the information used is
taken from buffer; by default, it comes from window’s
buffer.
The value string normally has text properties that correspond to the
faces, keymaps, etc., that the mode line would have. Any character for
which no face property is specified by format gets a
default value determined by face. If face is t, that
stands for either mode-line if window is selected,
otherwise mode-line-inactive. If face is nil or
omitted, that stands for the default face. If face is an integer,
the value returned by this function will have no text properties.
You can also specify other valid faces as the value of face.
If specified, that face provides the face property for characters
whose face is not specified by format.
Note that using mode-line, mode-line-inactive, or
header-line as face will actually redisplay the mode line
or the header line, respectively, using the current definitions of the
corresponding face, in addition to returning the formatted string.
(Other faces do not cause redisplay.)
For example, (format-mode-line header-line-format) returns the
text that would appear in the selected window’s header line (""
if it has no header line). (format-mode-line header-line-format
'header-line) returns the same text, with each character
carrying the face that it will have in the header line itself, and also
redraws the header line.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Imenu is a feature that lets users select a definition or
section in the buffer, from a menu which lists all of them, to go
directly to that location in the buffer. Imenu works by constructing
a buffer index which lists the names and buffer positions of the
definitions, or other named portions of the buffer; then the user can
choose one of them and move point to it. Major modes can add a menu
bar item to use Imenu using imenu-add-to-menubar.
This function defines a local menu bar item named name to run Imenu.
The user-level commands for using Imenu are described in the Emacs Manual (see Imenu in the Emacs Manual). This section explains how to customize Imenu’s method of finding definitions or buffer portions for a particular major mode.
The usual and simplest way is to set the variable
imenu-generic-expression:
This variable, if non-nil, is a list that specifies regular
expressions for finding definitions for Imenu. Simple elements of
imenu-generic-expression look like this:
(menu-title regexp index)
Here, if menu-title is non-nil, it says that the matches
for this element should go in a submenu of the buffer index;
menu-title itself specifies the name for the submenu. If
menu-title is nil, the matches for this element go directly
in the top level of the buffer index.
The second item in the list, regexp, is a regular expression (see section Regular Expressions); anything in the buffer that it matches is considered a definition, something to mention in the buffer index. The third item, index, is a non-negative integer that indicates which subexpression in regexp matches the definition’s name.
An element can also look like this:
(menu-title regexp index function arguments…)
Each match for this element creates an index item, and when the index item is selected by the user, it calls function with arguments consisting of the item name, the buffer position, and arguments.
For Emacs Lisp mode, imenu-generic-expression could look like
this:
((nil "^\\s-*(def\\(un\\|subst\\|macro\\|advice\\)\ \\s-+\\([-A-Za-z0-9+]+\\)" 2)
("*Vars*" "^\\s-*(def\\(var\\|const\\)\
\\s-+\\([-A-Za-z0-9+]+\\)" 2)
("*Types*"
"^\\s-*\
(def\\(type\\|struct\\|class\\|ine-condition\\)\
\\s-+\\([-A-Za-z0-9+]+\\)" 2))
Setting this variable makes it buffer-local in the current buffer.
This variable controls whether matching against the regular
expressions in the value of imenu-generic-expression is
case-sensitive: t, the default, means matching should ignore
case.
Setting this variable makes it buffer-local in the current buffer.
This variable is an alist of syntax table modifiers to use while
processing imenu-generic-expression, to override the syntax table
of the current buffer. Each element should have this form:
(characters . syntax-description)
The CAR, characters, can be either a character or a string.
The element says to give that character or characters the syntax
specified by syntax-description, which is passed to
modify-syntax-entry (see section Syntax Table Functions).
This feature is typically used to give word syntax to characters which
normally have symbol syntax, and thus to simplify
imenu-generic-expression and speed up matching.
For example, Fortran mode uses it this way:
(setq imenu-syntax-alist '(("_$" . "w")))
The imenu-generic-expression regular expressions can then use
‘\\sw+’ instead of ‘\\(\\sw\\|\\s_\\)+’. Note that this
technique may be inconvenient when the mode needs to limit the initial
character of a name to a smaller set of characters than are allowed in
the rest of a name.
Setting this variable makes it buffer-local in the current buffer.
Another way to customize Imenu for a major mode is to set the
variables imenu-prev-index-position-function and
imenu-extract-index-name-function:
If this variable is non-nil, its value should be a function that
finds the next “definition” to put in the buffer index, scanning
backward in the buffer from point. It should return nil if it
doesn’t find another “definition” before point. Otherwise it should
leave point at the place it finds a “definition” and return any
non-nil value.
Setting this variable makes it buffer-local in the current buffer.
If this variable is non-nil, its value should be a function to
return the name for a definition, assuming point is in that definition
as the imenu-prev-index-position-function function would leave
it.
Setting this variable makes it buffer-local in the current buffer.
The last way to customize Imenu for a major mode is to set the
variable imenu-create-index-function:
This variable specifies the function to use for creating a buffer
index. The function should take no arguments, and return an index
alist for the current buffer. It is called within
save-excursion, so where it leaves point makes no difference.
The index alist can have three types of elements. Simple elements look like this:
(index-name . index-position)
Selecting a simple element has the effect of moving to position index-position in the buffer. Special elements look like this:
(index-name index-position function arguments…)
Selecting a special element performs:
(funcall function
index-name index-position arguments…)
A nested sub-alist element looks like this:
(menu-title . sub-alist)
It creates the submenu menu-title specified by sub-alist.
The default value of imenu-create-index-function is
imenu-default-create-index-function. This function calls the
value of imenu-prev-index-position-function and the value of
imenu-extract-index-name-function to produce the index alist.
However, if either of these two variables is nil, the default
function uses imenu-generic-expression instead.
Setting this variable makes it buffer-local in the current buffer.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Font Lock mode is a buffer-local minor mode that automatically
attaches face properties to certain parts of the buffer based on
their syntactic role. How it parses the buffer depends on the major
mode; most major modes define syntactic criteria for which faces to use
in which contexts. This section explains how to customize Font Lock for
a particular major mode.
Font Lock mode finds text to highlight in two ways: through syntactic parsing based on the syntax table, and through searching (usually for regular expressions). Syntactic fontification happens first; it finds comments and string constants and highlights them. Search-based fontification happens second.
| 22.6.1 Font Lock Basics | Overview of customizing Font Lock. | |
| 22.6.2 Search-based Fontification | Fontification based on regexps. | |
| 22.6.3 Customizing Search-Based Fontification | Customizing search-based fontification. | |
| 22.6.4 Other Font Lock Variables | Additional customization facilities. | |
| 22.6.5 Levels of Font Lock | Each mode can define alternative levels so that the user can select more or less. | |
| 22.6.6 Precalculated Fontification | How Lisp programs that produce the buffer contents can also specify how to fontify it. | |
| 22.6.7 Faces for Font Lock | Special faces specifically for Font Lock. | |
| 22.6.8 Syntactic Font Lock | Fontification based on syntax tables. | |
| 22.6.9 Multiline Font Lock Constructs | How to coerce Font Lock into properly highlighting multiline constructs. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
There are several variables that control how Font Lock mode highlights
text. But major modes should not set any of these variables directly.
Instead, they should set font-lock-defaults as a buffer-local
variable. The value assigned to this variable is used, if and when Font
Lock mode is enabled, to set all the other variables.
This variable is set by major modes to specify how to fontify text in
that mode. It automatically becomes buffer-local when set. If its
value is nil, Font Lock mode does no highlighting, and you can
use the ‘Faces’ menu (under ‘Edit’ and then ‘Text
Properties’ in the menu bar) to assign faces explicitly to text in the
buffer.
If non-nil, the value should look like this:
(keywords [keywords-only [case-fold [syntax-alist [syntax-begin other-vars…]]]])
The first element, keywords, indirectly specifies the value of
font-lock-keywords which directs search-based fontification.
It can be a symbol, a variable or a function whose value is the list
to use for font-lock-keywords. It can also be a list of
several such symbols, one for each possible level of fontification.
The first symbol specifies the ‘mode default’ level of
fontification, the next symbol level 1 fontification, the next level 2,
and so on. The ‘mode default’ level is normally the same as level
1. It is used when font-lock-maximum-decoration has a nil
value. See section Levels of Font Lock.
The second element, keywords-only, specifies the value of the
variable font-lock-keywords-only. If this is omitted or
nil, syntactic fontification (of strings and comments) is also
performed. If this is non-nil, syntactic fontification is not
performed. See section Syntactic Font Lock.
The third element, case-fold, specifies the value of
font-lock-keywords-case-fold-search. If it is non-nil,
Font Lock mode ignores case during search-based fontification.
If the fourth element, syntax-alist, is non-nil, it should
be a list of cons cells of the form (char-or-string
. string). These are used to set up a syntax table for syntactic
fontification; the resulting syntax table is stored in
font-lock-syntax-table. If syntax-alist is omitted or
nil, syntactic fontification uses the syntax table returned by
the syntax-table function. See section Syntax Table Functions.
The fifth element, syntax-begin, specifies the value of
font-lock-beginning-of-syntax-function. We recommend setting
this variable to nil and using syntax-begin-function
instead.
All the remaining elements (if any) are collectively called
other-vars. Each of these elements should have the form
(variable . value)—which means, make
variable buffer-local and then set it to value. You can
use these other-vars to set other variables that affect
fontification, aside from those you can control with the first five
elements. See section Other Font Lock Variables.
If your mode fontifies text explicitly by adding
font-lock-face properties, it can specify (nil t) for
font-lock-defaults to turn off all automatic fontification.
However, this is not required; it is possible to fontify some things
using font-lock-face properties and set up automatic
fontification for other parts of the text.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The variable which directly controls search-based fontification is
font-lock-keywords, which is typically specified via the
keywords element in font-lock-defaults.
The value of this variable is a list of the keywords to highlight. Lisp
programs should not set this variable directly. Normally, the value is
automatically set by Font Lock mode, using the keywords element in
font-lock-defaults. The value can also be altered using the
functions font-lock-add-keywords and
font-lock-remove-keywords (see section Customizing Search-Based Fontification).
Each element of font-lock-keywords specifies how to find
certain cases of text, and how to highlight those cases. Font Lock mode
processes the elements of font-lock-keywords one by one, and for
each element, it finds and handles all matches. Ordinarily, once
part of the text has been fontified already, this cannot be overridden
by a subsequent match in the same text; but you can specify different
behavior using the override element of a subexp-highlighter.
Each element of font-lock-keywords should have one of these
forms:
regexpHighlight all matches for regexp using
font-lock-keyword-face. For example,
;; Highlight occurrences of the word ‘foo’
;; using font-lock-keyword-face.
"\\<foo\\>"
Be careful when composing these regular expressions; a poorly written
pattern can dramatically slow things down! The function
regexp-opt (see section Regular Expression Functions) is useful for calculating
optimal regular expressions to match several keywords.
functionFind text by calling function, and highlight the matches
it finds using font-lock-keyword-face.
When function is called, it receives one argument, the limit of
the search; it should begin searching at point, and not search beyond the
limit. It should return non-nil if it succeeds, and set the
match data to describe the match that was found. Returning nil
indicates failure of the search.
Fontification will call function repeatedly with the same limit, and with point where the previous invocation left it, until function fails. On failure, function need not reset point in any particular way.
(matcher . subexp)In this kind of element, matcher is either a regular expression or a function, as described above. The CDR, subexp, specifies which subexpression of matcher should be highlighted (instead of the entire text that matcher matched).
;; Highlight the ‘bar’ in each occurrence of ‘fubar’,
;; using font-lock-keyword-face.
("fu\\(bar\\)" . 1)
If you use regexp-opt to produce the regular expression
matcher, you can use regexp-opt-depth (see section Regular Expression Functions) to calculate the value for subexp.
(matcher . facespec)In this kind of element, facespec is an expression whose value specifies the face to use for highlighting. In the simplest case, facespec is a Lisp variable (a symbol) whose value is a face name.
;; Highlight occurrences of ‘fubar’,
;; using the face which is the value of fubar-face.
("fubar" . fubar-face)
However, facespec can also evaluate to a list of this form:
(face face prop1 val1 prop2 val2…)
to specify the face face and various additional text properties
to put on the text that matches. If you do this, be sure to add the
other text property names that you set in this way to the value of
font-lock-extra-managed-props so that the properties will also
be cleared out when they are no longer appropriate. Alternatively,
you can set the variable font-lock-unfontify-region-function to
a function that clears these properties. See section Other Font Lock Variables.
(matcher . subexp-highlighter)In this kind of element, subexp-highlighter is a list which specifies how to highlight matches found by matcher. It has the form:
(subexp facespec [override [laxmatch]])
The CAR, subexp, is an integer specifying which subexpression of the match to fontify (0 means the entire matching text). The second subelement, facespec, is an expression whose value specifies the face, as described above.
The last two values in subexp-highlighter, override and
laxmatch, are optional flags. If override is t,
this element can override existing fontification made by previous
elements of font-lock-keywords. If it is keep, then
each character is fontified if it has not been fontified already by
some other element. If it is prepend, the face specified by
facespec is added to the beginning of the font-lock-face
property. If it is append, the face is added to the end of the
font-lock-face property.
If laxmatch is non-nil, it means there should be no error
if there is no subexpression numbered subexp in matcher.
Obviously, fontification of the subexpression numbered subexp will
not occur. However, fontification of other subexpressions (and other
regexps) will continue. If laxmatch is nil, and the
specified subexpression is missing, then an error is signaled which
terminates search-based fontification.
Here are some examples of elements of this kind, and what they do:
;; Highlight occurrences of either ‘foo’ or ‘bar’, using ;;foo-bar-face, even if they have already been highlighted. ;;foo-bar-faceshould be a variable whose value is a face. ("foo\\|bar" 0 foo-bar-face t) ;; Highlight the first subexpression within each occurrence ;; that the functionfubar-matchfinds, ;; using the face which is the value offubar-face. (fubar-match 1 fubar-face)
(matcher . anchored-highlighter)In this kind of element, anchored-highlighter specifies how to highlight text that follows a match found by matcher. So a match found by matcher acts as the anchor for further searches specified by anchored-highlighter. anchored-highlighter is a list of the following form:
(anchored-matcher pre-form post-form
subexp-highlighters…)
Here, anchored-matcher, like matcher, is either a regular expression or a function. After a match of matcher is found, point is at the end of the match. Now, Font Lock evaluates the form pre-form. Then it searches for matches of anchored-matcher and uses subexp-highlighters to highlight these. A subexp-highlighter is as described above. Finally, Font Lock evaluates post-form.
The forms pre-form and post-form can be used to initialize before, and cleanup after, anchored-matcher is used. Typically, pre-form is used to move point to some position relative to the match of matcher, before starting with anchored-matcher. post-form might be used to move back, before resuming with matcher.
After Font Lock evaluates pre-form, it does not search for anchored-matcher beyond the end of the line. However, if pre-form returns a buffer position that is greater than the position of point after pre-form is evaluated, then the position returned by pre-form is used as the limit of the search instead. It is generally a bad idea to return a position greater than the end of the line; in other words, the anchored-matcher search should not span lines.
For example,
;; Highlight occurrences of the word ‘item’ following
;; an occurrence of the word ‘anchor’ (on the same line)
;; in the value of item-face.
("\\<anchor\\>" "\\<item\\>" nil nil (0 item-face))
Here, pre-form and post-form are nil. Therefore
searching for ‘item’ starts at the end of the match of
‘anchor’, and searching for subsequent instances of ‘anchor’
resumes from where searching for ‘item’ concluded.
(matcher highlighters…)This sort of element specifies several highlighter lists for a single matcher. A highlighter list can be of the type subexp-highlighter or anchored-highlighter as described above.
For example,
;; Highlight occurrences of the word ‘anchor’ in the value ;; ofanchor-face, and subsequent occurrences of the word ;; ‘item’ (on the same line) in the value ofitem-face. ("\\<anchor\\>" (0 anchor-face) ("\\<item\\>" nil nil (0 item-face)))
(eval . form)Here form is an expression to be evaluated the first time
this value of font-lock-keywords is used in a buffer.
Its value should have one of the forms described in this table.
Warning: Do not design an element of font-lock-keywords
to match text which spans lines; this does not work reliably.
For details, see See section Multiline Font Lock Constructs.
You can use case-fold in font-lock-defaults to specify
the value of font-lock-keywords-case-fold-search which says
whether search-based fontification should be case-insensitive.
Non-nil means that regular expression matching for the sake of
font-lock-keywords should be case-insensitive.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can use font-lock-add-keywords to add additional
search-based fontification rules to a major mode, and
font-lock-remove-keywords to remove rules.
This function adds highlighting keywords, for the current buffer
or for major mode mode. The argument keywords should be a
list with the same format as the variable font-lock-keywords.
If mode is a symbol which is a major mode command name, such as
c-mode, the effect is that enabling Font Lock mode in
mode will add keywords to font-lock-keywords.
Calling with a non-nil value of mode is correct only in
your ~/.emacs file.
If mode is nil, this function adds keywords to
font-lock-keywords in the current buffer. This way of calling
font-lock-add-keywords is usually used in mode hook functions.
By default, keywords are added at the beginning of
font-lock-keywords. If the optional argument how is
set, they are used to replace the value of
font-lock-keywords. If how is any other non-nil
value, they are added at the end of font-lock-keywords.
Some modes provide specialized support you can use in additional
highlighting patterns. See the variables
c-font-lock-extra-types, c++-font-lock-extra-types,
and java-font-lock-extra-types, for example.
Warning: Major mode commands must not call
font-lock-add-keywords under any circumstances, either directly
or indirectly, except through their mode hooks. (Doing so would lead to
incorrect behavior for some minor modes.) They should set up their
rules for search-based fontification by setting
font-lock-keywords.
This function removes keywords from font-lock-keywords
for the current buffer or for major mode mode. As in
font-lock-add-keywords, mode should be a major mode
command name or nil. All the caveats and requirements for
font-lock-add-keywords apply here too.
For example, the following code adds two fontification patterns for C mode: one to fontify the word ‘FIXME’, even in comments, and another to fontify the words ‘and’, ‘or’ and ‘not’ as keywords.
(font-lock-add-keywords 'c-mode
'(("\\<\\(FIXME\\):" 1 font-lock-warning-face prepend)
("\\<\\(and\\|or\\|not\\)\\>" . font-lock-keyword-face)))
This example affects only C mode proper. To add the same patterns to C mode and all modes derived from it, do this instead:
(add-hook 'c-mode-hook
(lambda ()
(font-lock-add-keywords nil
'(("\\<\\(FIXME\\):" 1 font-lock-warning-face prepend)
("\\<\\(and\\|or\\|not\\)\\>" .
font-lock-keyword-face)))))
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes additional variables that a major mode can
set by means of other-vars in font-lock-defaults
(see section Font Lock Basics).
If this variable is non-nil, it should be a function that is
called with no arguments, to choose an enclosing range of text for
refontification for the command M-o M-o
(font-lock-fontify-block).
The function should report its choice by placing the region around it.
A good choice is a range of text large enough to give proper results,
but not too large so that refontification becomes slow. Typical values
are mark-defun for programming modes or mark-paragraph for
textual modes.
This variable specifies additional properties (other than
font-lock-face) that are being managed by Font Lock mode. It
is used by font-lock-default-unfontify-region, which normally
only manages the font-lock-face property. If you want Font
Lock to manage other properties as well, you must specify them in a
facespec in font-lock-keywords as well as add them to
this list. See section Search-based Fontification.
Function to use for fontifying the buffer. The default value is
font-lock-default-fontify-buffer.
Function to use for unfontifying the buffer. This is used when
turning off Font Lock mode. The default value is
font-lock-default-unfontify-buffer.
Function to use for fontifying a region. It should take two
arguments, the beginning and end of the region, and an optional third
argument verbose. If verbose is non-nil, the
function should print status messages. The default value is
font-lock-default-fontify-region.
Function to use for unfontifying a region. It should take two
arguments, the beginning and end of the region. The default value is
font-lock-default-unfontify-region.
This function tells Font Lock mode to run the Lisp function function any time it has to fontify or refontify part of the current buffer. It calls function before calling the default fontification functions, and gives it two arguments, start and end, which specify the region to be fontified or refontified.
The optional argument contextual, if non-nil, forces Font
Lock mode to always refontify a syntactically relevant part of the
buffer, and not just the modified lines. This argument can usually be
omitted.
If function was previously registered as a fontification
function using jit-lock-register, this function unregisters it.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Some major modes offer three different levels of fontification. You
can define multiple levels by using a list of symbols for keywords
in font-lock-defaults. Each symbol specifies one level of
fontification; it is up to the user to choose one of these levels,
normally by setting font-lock-maximum-decoration (see Font
Lock in the GNU Emacs Manual). The chosen level’s symbol value
is used to initialize font-lock-keywords.
Here are the conventions for how to define the levels of fontification:
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Some major modes such as list-buffers and occur
construct the buffer text programmatically. The easiest way for them
to support Font Lock mode is to specify the faces of text when they
insert the text in the buffer.
The way to do this is to specify the faces in the text with the
special text property font-lock-face (see section Properties with Special Meanings). When Font Lock mode is enabled, this property controls
the display, just like the face property. When Font Lock mode
is disabled, font-lock-face has no effect on the display.
It is ok for a mode to use font-lock-face for some text and
also use the normal Font Lock machinery. But if the mode does not use
the normal Font Lock machinery, it should not set the variable
font-lock-defaults.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Font Lock mode can highlight using any face, but Emacs defines several faces specifically for Font Lock to use to highlight text. These Font Lock faces are listed below. They can also be used by major modes for syntactic highlighting outside of Font Lock mode (see section Major Mode Conventions).
Each of these symbols is both a face name, and a variable whose
default value is the symbol itself. Thus, the default value of
font-lock-comment-face is font-lock-comment-face.
The faces are listed with descriptions of their typical usage, and in order of greater to lesser “prominence”. If a mode’s syntactic categories do not fit well with the usage descriptions, the faces can be assigned using the ordering as a guide.
font-lock-warning-facefor a construct that is peculiar, or that greatly changes the meaning of other text, like ‘;;;###autoload’ in Emacs Lisp and ‘#error’ in C.
font-lock-function-name-facefor the name of a function being defined or declared.
font-lock-variable-name-facefor the name of a variable being defined or declared.
font-lock-keyword-facefor a keyword with special syntactic significance, like ‘for’ and ‘if’ in C.
font-lock-comment-facefor comments.
font-lock-comment-delimiter-facefor comments delimiters, like ‘/*’ and ‘*/’ in C. On most
terminals, this inherits from font-lock-comment-face.
font-lock-type-facefor the names of user-defined data types.
font-lock-constant-facefor the names of constants, like ‘NULL’ in C.
font-lock-builtin-facefor the names of built-in functions.
font-lock-preprocessor-facefor preprocessor commands. This inherits, by default, from
font-lock-builtin-face.
font-lock-string-facefor string constants.
font-lock-doc-facefor documentation strings in the code. This inherits, by default, from
font-lock-string-face.
font-lock-negation-char-facefor easily-overlooked negation characters.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Syntactic fontification uses a syntax table (see section Syntax Tables) to
find and highlight syntactically relevant text. If enabled, it runs
prior to search-based fontification. The variable
font-lock-syntactic-face-function, documented below, determines
which syntactic constructs to highlight. There are several variables
that affect syntactic fontification; you should set them by means of
font-lock-defaults (see section Font Lock Basics).
Whenever Font Lock mode performs syntactic fontification on a stretch
of text, it first calls the function specified by
syntax-propertize-function. Major modes can use this to apply
syntax-table text properties to override the buffer’s syntax
table in special cases. See section Syntax Properties.
If the value of this variable is non-nil, Font Lock does not do
syntactic fontification, only search-based fontification based on
font-lock-keywords. It is normally set by Font Lock mode based
on the keywords-only element in font-lock-defaults.
This variable holds the syntax table to use for fontification of
comments and strings. It is normally set by Font Lock mode based on the
syntax-alist element in font-lock-defaults. If this value
is nil, syntactic fontification uses the buffer’s syntax table
(the value returned by the function syntax-table; see section Syntax Table Functions).
If this variable is non-nil, it should be a function to move
point back to a position that is syntactically at “top level” and
outside of strings or comments. The value is normally set through an
other-vars element in font-lock-defaults. If it is
nil, Font Lock uses syntax-begin-function to move back
outside of any comment, string, or sexp (see section Finding the Parse State for a Position).
This variable is semi-obsolete; we usually recommend setting
syntax-begin-function instead. One of its uses is to tune the
behavior of syntactic fontification, e.g., to ensure that different
kinds of strings or comments are highlighted differently.
The specified function is called with no arguments. It should leave
point at the beginning of any enclosing syntactic block. Typical values
are beginning-of-line (used when the start of the line is known
to be outside a syntactic block), or beginning-of-defun for
programming modes, or backward-paragraph for textual modes.
If this variable is non-nil, it should be a function to determine
which face to use for a given syntactic element (a string or a comment).
The value is normally set through an other-vars element in
font-lock-defaults.
The function is called with one argument, the parse state at point
returned by parse-partial-sexp, and should return a face. The
default value returns font-lock-comment-face for comments and
font-lock-string-face for strings (see section Faces for Font Lock).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Normally, elements of font-lock-keywords should not match
across multiple lines; that doesn’t work reliably, because Font Lock
usually scans just part of the buffer, and it can miss a multi-line
construct that crosses the line boundary where the scan starts. (The
scan normally starts at the beginning of a line.)
Making elements that match multiline constructs work properly has two aspects: correct identification and correct rehighlighting. The first means that Font Lock finds all multiline constructs. The second means that Font Lock will correctly rehighlight all the relevant text when a multiline construct is changed—for example, if some of the text that was previously part of a multiline construct ceases to be part of it. The two aspects are closely related, and often getting one of them to work will appear to make the other also work. However, for reliable results you must attend explicitly to both aspects.
There are three ways to ensure correct identification of multiline constructs:
font-lock-extend-region-functions that does
the identification and extends the scan so that the scanned
text never starts or ends in the middle of a multiline construct.
font-lock-fontify-region-function hook similarly to
extend the scan so that the scanned text never starts or ends in the
middle of a multiline construct.
font-lock-multiline
which will instruct font-lock not to start or end the scan in the
middle of the construct.
There are three ways to do rehighlighting of multiline constructs:
font-lock-multiline property on the construct. This
will rehighlight the whole construct if any part of it is changed. In
some cases you can do this automatically by setting the
font-lock-multiline variable, which see.
jit-lock-contextually is set and rely on it doing its
job. This will only rehighlight the part of the construct that
follows the actual change, and will do it after a short delay.
This only works if the highlighting of the various parts of your
multiline construct never depends on text in subsequent lines.
Since jit-lock-contextually is activated by default, this can
be an attractive solution.
jit-lock-defer-multiline property on the construct.
This works only if jit-lock-contextually is used, and with the
same delay before rehighlighting, but like font-lock-multiline,
it also handles the case where highlighting depends on
subsequent lines.
| 22.6.9.1 Font Lock Multiline | Marking multiline chunks with a text property. | |
| 22.6.9.2 Region to Fontify after a Buffer Change | Controlling which region gets refontified after a buffer change. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
One way to ensure reliable rehighlighting of multiline Font Lock
constructs is to put on them the text property font-lock-multiline.
It should be present and non-nil for text that is part of a
multiline construct.
When Font Lock is about to highlight a range of text, it first
extends the boundaries of the range as necessary so that they do not
fall within text marked with the font-lock-multiline property.
Then it removes any font-lock-multiline properties from the
range, and highlights it. The highlighting specification (mostly
font-lock-keywords) must reinstall this property each time,
whenever it is appropriate.
Warning: don’t use the font-lock-multiline property
on large ranges of text, because that will make rehighlighting slow.
If the font-lock-multiline variable is set to t, Font
Lock will try to add the font-lock-multiline property
automatically on multiline constructs. This is not a universal
solution, however, since it slows down Font Lock somewhat. It can
miss some multiline constructs, or make the property larger or smaller
than necessary.
For elements whose matcher is a function, the function should
ensure that submatch 0 covers the whole relevant multiline construct,
even if only a small subpart will be highlighted. It is often just as
easy to add the font-lock-multiline property by hand.
The font-lock-multiline property is meant to ensure proper
refontification; it does not automatically identify new multiline
constructs. Identifying the requires that Font Lock mode operate on
large enough chunks at a time. This will happen by accident on many
cases, which may give the impression that multiline constructs magically
work. If you set the font-lock-multiline variable
non-nil, this impression will be even stronger, since the
highlighting of those constructs which are found will be properly
updated from then on. But that does not work reliably.
To find multiline constructs reliably, you must either manually place
the font-lock-multiline property on the text before Font Lock
mode looks at it, or use font-lock-fontify-region-function.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When a buffer is changed, the region that Font Lock refontifies is by default the smallest sequence of whole lines that spans the change. While this works well most of the time, sometimes it doesn’t—for example, when a change alters the syntactic meaning of text on an earlier line.
You can enlarge (or even reduce) the region to refontify by setting the following variable:
This buffer-local variable is either nil or a function for Font
Lock mode to call to determine the region to scan and fontify.
The function is given three parameters, the standard beg,
end, and old-len from after-change-functions
(see section Change Hooks). It should return either a cons of the
beginning and end buffer positions (in that order) of the region to
fontify, or nil (which means choose the region in the standard
way). This function needs to preserve point, the match-data, and the
current restriction. The region it returns may start or end in the
middle of a line.
Since this function is called after every buffer change, it should be reasonably fast.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
For programming languages, an important feature of a major mode is to
provide automatic indentation. There are two parts: one is to decide what
is the right indentation of a line, and the other is to decide when to
reindent a line. By default, Emacs reindents a line whenever you
type a character in electric-indent-chars, which by default only
includes Newline. Major modes can add chars to electric-indent-chars
according to the syntax of the language.
Deciding what is the right indentation is controlled in Emacs by
indent-line-function (see section Indentation Controlled by Major Mode). For some modes,
the right indentation cannot be known reliably, typically because
indentation is significant so several indentations are valid but with different
meanings. In that case, the mode should set electric-indent-inhibit to
make sure the line is not constantly re-indented against the user’s wishes.
Writing a good indentation function can be difficult and to a large extent it is still a black art. Many major mode authors will start by writing a simple indentation function that works for simple cases, for example by comparing with the indentation of the previous text line. For most programming languages that are not really line-based, this tends to scale very poorly: improving such a function to let it handle more diverse situations tends to become more and more difficult, resulting in the end with a large, complex, unmaintainable indentation function which nobody dares to touch.
A good indentation function will usually need to actually parse the text, according to the syntax of the language. Luckily, it is not necessary to parse the text in as much detail as would be needed for a compiler, but on the other hand, the parser embedded in the indentation code will want to be somewhat friendly to syntactically incorrect code.
Good maintainable indentation functions usually fall into two categories: either parsing forward from some “safe” starting point until the position of interest, or parsing backward from the position of interest. Neither of the two is a clearly better choice than the other: parsing backward is often more difficult than parsing forward because programming languages are designed to be parsed forward, but for the purpose of indentation it has the advantage of not needing to guess a “safe” starting point, and it generally enjoys the property that only a minimum of text will be analyzed to decide the indentation of a line, so indentation will tend to be less affected by syntax errors in some earlier unrelated piece of code. Parsing forward on the other hand is usually easier and has the advantage of making it possible to reindent efficiently a whole region at a time, with a single parse.
Rather than write your own indentation function from scratch, it is often preferable to try and reuse some existing ones or to rely on a generic indentation engine. There are sadly few such engines. The CC-mode indentation code (used with C, C++, Java, Awk and a few other such modes) has been made more generic over the years, so if your language seems somewhat similar to one of those languages, you might try to use that engine. Another one is SMIE which takes an approach in the spirit of Lisp sexps and adapts it to non-Lisp languages.
| 22.7.1 Simple Minded Indentation Engine | A simple minded indentation engine. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
SMIE is a package that provides a generic navigation and indentation engine. Based on a very simple parser using an “operator precedence grammar”, it lets major modes extend the sexp-based navigation of Lisp to non-Lisp languages as well as provide a simple to use but reliable auto-indentation.
Operator precedence grammar is a very primitive technology for parsing
compared to some of the more common techniques used in compilers.
It has the following characteristics: its parsing power is very limited,
and it is largely unable to detect syntax errors, but it has the
advantage of being algorithmically efficient and able to parse forward
just as well as backward. In practice that means that SMIE can use it
for indentation based on backward parsing, that it can provide both
forward-sexp and backward-sexp functionality, and that it
will naturally work on syntactically incorrect code without any extra
effort. The downside is that it also means that most programming
languages cannot be parsed correctly using SMIE, at least not without
resorting to some special tricks (see section Living With a Weak Parser).
| 22.7.1.1 SMIE Setup and Features | SMIE setup and features. | |
| 22.7.1.2 Operator Precedence Grammars | A very simple parsing technique. | |
| 22.7.1.3 Defining the Grammar of a Language | Defining the grammar of a language. | |
| 22.7.1.4 Defining Tokens | Defining tokens. | |
| 22.7.1.5 Living With a Weak Parser | Working around the parser’s limitations. | |
| 22.7.1.6 Specifying Indentation Rules | Specifying indentation rules. | |
| 22.7.1.7 Helper Functions for Indentation Rules | Helper functions for indentation rules. | |
| 22.7.1.8 Sample Indentation Rules | Sample indentation rules. | |
| 22.7.1.9 Customizing Indentation | Customizing indentation. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
SMIE is meant to be a one-stop shop for structural navigation and
various other features which rely on the syntactic structure of code, in
particular automatic indentation. The main entry point is
smie-setup which is a function typically called while setting
up a major mode.
Setup SMIE navigation and indentation.
grammar is a grammar table generated by smie-prec2->grammar.
rules-function is a set of indentation rules for use on
smie-rules-function.
keywords are additional arguments, which can include the following
keywords:
:forward-token fun: Specify the forward lexer to use.
:backward-token fun: Specify the backward lexer to use.
Calling this function is sufficient to make commands such as
forward-sexp, backward-sexp, and transpose-sexps be
able to properly handle structural elements other than just the paired
parentheses already handled by syntax tables. For example, if the
provided grammar is precise enough, transpose-sexps can correctly
transpose the two arguments of a + operator, taking into account
the precedence rules of the language.
Calling ‘smie-setup’ is also sufficient to make TAB indentation work in
the expected way, extends blink-matching-paren to apply to
elements like begin...end, and provides some commands that you
can bind in the major mode keymap.
This command closes the most recently opened (and not yet closed) block.
This command is like down-list but it also pays attention to
nesting of tokens other than parentheses, such as begin...end.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
SMIE’s precedence grammars simply give to each token a pair of
precedences: the left-precedence and the right-precedence. We say
T1 < T2 if the right-precedence of token T1 is less than
the left-precedence of token T2. A good way to read this
< is as a kind of parenthesis: if we find ... T1 something
T2 ... then that should be parsed as ... T1 (something T2 ...
rather than as ... T1 something) T2 .... The latter
interpretation would be the case if we had T1 > T2. If we have
T1 = T2, it means that token T2 follows token T1 in the same
syntactic construction, so typically we have "begin" = "end".
Such pairs of precedences are sufficient to express left-associativity
or right-associativity of infix operators, nesting of tokens like
parentheses and many other cases.
This function takes a prec2 grammar table and returns an
alist suitable for use in smie-setup. The prec2
table is itself meant to be built by one of the functions below.
This function takes several prec2 tables and merges them into a new prec2 table.
This function builds a prec2 table from a table of precedences
precs. precs should be a list, sorted by precedence (for
example "+" will come before "*"), of elements of the form
(assoc op ...), where each op is a token that
acts as an operator; assoc is their associativity, which can be
either left, right, assoc, or nonassoc.
All operators in a given element share the same precedence level
and associativity.
This function lets you specify the grammar using a BNF notation. It accepts a bnf description of the grammar along with a set of conflict resolution rules resolvers, and returns a prec2 table.
bnf is a list of nonterminal definitions of the form
(nonterm rhs1 rhs2 ...) where each rhs
is a (non-empty) list of terminals (aka tokens) or non-terminals.
Not all grammars are accepted:
Additionally, conflicts can occur:
opener (something similar to an open-paren),
a closer (like a close-paren), or neither of the two
(e.g., an infix operator, or an inner token like "else").
Precedence conflicts can be resolved via resolvers, which
is a list of precs tables (see smie-precs->prec2): for
each precedence conflict, if those precs tables
specify a particular constraint, then the conflict is resolved by using
this constraint instead, else a conflict is reported and one of the
conflicting constraints is picked arbitrarily and the others are
simply ignored.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The usual way to define the SMIE grammar of a language is by defining a new global variable that holds the precedence table by giving a set of BNF rules. For example, the grammar definition for a small Pascal-like language could look like:
(require 'smie) (defvar sample-smie-grammar (smie-prec2->grammar (smie-bnf->prec2
'((id)
(inst ("begin" insts "end")
("if" exp "then" inst "else" inst)
(id ":=" exp)
(exp))
(insts (insts ";" insts) (inst))
(exp (exp "+" exp)
(exp "*" exp)
("(" exps ")"))
(exps (exps "," exps) (exp)))
'((assoc ";"))
'((assoc ","))
'((assoc "+") (assoc "*")))))
A few things to note:
begin ... end blocks
to appear anywhere anyway.
id has no right hand side: this does not
mean that it can match only the empty string, since as mentioned any
sequence of sexps can appear anywhere anyway.
";" as a statement separator instead,
which SMIE can handle very well.
"," and ";" above)
are best defined with BNF rules such as (foo (foo "separator" foo) ...)
which generate precedence conflicts which are then resolved by giving
them an explicit (assoc "separator").
("(" exps ")") rule was not needed to pair up parens, since
SMIE will pair up any characters that are marked as having paren syntax
in the syntax table. What this rule does instead (together with the
definition of exps) is to make it clear that "," should
not appear outside of parentheses.
left or
right, it is usually preferable to mark operators as associative,
using assoc. For that reason "+" and "*" are
defined above as assoc, although the language defines them
formally as left associative.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
SMIE comes with a predefined lexical analyzer which uses syntax tables
in the following way: any sequence of characters that have word or
symbol syntax is considered a token, and so is any sequence of
characters that have punctuation syntax. This default lexer is
often a good starting point but is rarely actually correct for any given
language. For example, it will consider "2,+3" to be composed
of 3 tokens: "2", ",+", and "3".
To describe the lexing rules of your language to SMIE, you need 2 functions, one to fetch the next token, and another to fetch the previous token. Those functions will usually first skip whitespace and comments and then look at the next chunk of text to see if it is a special token. If so it should skip the token and return a description of this token. Usually this is simply the string extracted from the buffer, but it can be anything you want. For example:
(defvar sample-keywords-regexp
(regexp-opt '("+" "*" "," ";" ">" ">=" "<" "<=" ":=" "=")))
(defun sample-smie-forward-token ()
(forward-comment (point-max))
(cond
((looking-at sample-keywords-regexp)
(goto-char (match-end 0))
(match-string-no-properties 0))
(t (buffer-substring-no-properties
(point)
(progn (skip-syntax-forward "w_")
(point))))))
(defun sample-smie-backward-token ()
(forward-comment (- (point)))
(cond
((looking-back sample-keywords-regexp (- (point) 2) t)
(goto-char (match-beginning 0))
(match-string-no-properties 0))
(t (buffer-substring-no-properties
(point)
(progn (skip-syntax-backward "w_")
(point))))))
Notice how those lexers return the empty string when in front of
parentheses. This is because SMIE automatically takes care of the
parentheses defined in the syntax table. More specifically if the lexer
returns nil or an empty string, SMIE tries to handle the corresponding
text as a sexp according to syntax tables.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The parsing technique used by SMIE does not allow tokens to behave differently in different contexts. For most programming languages, this manifests itself by precedence conflicts when converting the BNF grammar.
Sometimes, those conflicts can be worked around by expressing the grammar slightly differently. For example, for Modula-2 it might seem natural to have a BNF grammar that looks like this:
...
(inst ("IF" exp "THEN" insts "ELSE" insts "END")
("CASE" exp "OF" cases "END")
...)
(cases (cases "|" cases)
(caselabel ":" insts)
("ELSE" insts))
...
But this will create conflicts for "ELSE": on the one hand, the
IF rule implies (among many other things) that "ELSE" = "END";
but on the other hand, since "ELSE" appears within cases,
which appears left of "END", we also have "ELSE" > "END".
We can solve the conflict either by using:
...
(inst ("IF" exp "THEN" insts "ELSE" insts "END")
("CASE" exp "OF" cases "END")
("CASE" exp "OF" cases "ELSE" insts "END")
...)
(cases (cases "|" cases) (caselabel ":" insts))
...
or
...
(inst ("IF" exp "THEN" else "END")
("CASE" exp "OF" cases "END")
...)
(else (insts "ELSE" insts))
(cases (cases "|" cases) (caselabel ":" insts) (else))
...
Reworking the grammar to try and solve conflicts has its downsides, tho, because SMIE assumes that the grammar reflects the logical structure of the code, so it is preferable to keep the BNF closer to the intended abstract syntax tree.
Other times, after careful consideration you may conclude that those
conflicts are not serious and simply resolve them via the
resolvers argument of smie-bnf->prec2. Usually this is
because the grammar is simply ambiguous: the conflict does not affect
the set of programs described by the grammar, but only the way those
programs are parsed. This is typically the case for separators and
associative infix operators, where you want to add a resolver like
'((assoc "|")). Another case where this can happen is for the
classic dangling else problem, where you will use '((assoc
"else" "then")). It can also happen for cases where the conflict is
real and cannot really be resolved, but it is unlikely to pose a problem
in practice.
Finally, in many cases some conflicts will remain despite all efforts to
restructure the grammar. Do not despair: while the parser cannot be
made more clever, you can make the lexer as smart as you want. So, the
solution is then to look at the tokens involved in the conflict and to
split one of those tokens into 2 (or more) different tokens. E.g., if
the grammar needs to distinguish between two incompatible uses of the
token "begin", make the lexer return different tokens (say
"begin-fun" and "begin-plain") depending on which kind of
"begin" it finds. This pushes the work of distinguishing the
different cases to the lexer, which will thus have to look at the
surrounding text to find ad-hoc clues.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Based on the provided grammar, SMIE will be able to provide automatic indentation without any extra effort. But in practice, this default indentation style will probably not be good enough. You will want to tweak it in many different cases.
SMIE indentation is based on the idea that indentation rules should be
as local as possible. To this end, it relies on the idea of
virtual indentation, which is the indentation that a particular
program point would have if it were at the beginning of a line.
Of course, if that program point is indeed at the beginning of a line,
its virtual indentation is its current indentation. But if not, then
SMIE uses the indentation algorithm to compute the virtual indentation
of that point. Now in practice, the virtual indentation of a program
point does not have to be identical to the indentation it would have if
we inserted a newline before it. To see how this works, the SMIE rule
for indentation after a { in C does not care whether the
{ is standing on a line of its own or is at the end of the
preceding line. Instead, these different cases are handled in the
indentation rule that decides how to indent before a {.
Another important concept is the notion of parent: The
parent of a token, is the head token of the nearest enclosing
syntactic construct. For example, the parent of an else is the
if to which it belongs, and the parent of an if, in turn,
is the lead token of the surrounding construct. The command
backward-sexp jumps from a token to its parent, but there are
some caveats: for openers (tokens which start a construct, like
if), you need to start with point before the token, while for
others you need to start with point after the token.
backward-sexp stops with point before the parent token if that is
the opener of the token of interest, and otherwise it stops with
point after the parent token.
SMIE indentation rules are specified using a function that takes two arguments method and arg where the meaning of arg and the expected return value depend on method.
method can be:
:after, in which case arg is a token and the function
should return the offset to use for indentation after arg.
:before, in which case arg is a token and the function
should return the offset to use to indent arg itself.
:elem, in which case the function should return either the offset
to use to indent function arguments (if arg is the symbol
arg) or the basic indentation step (if arg is the symbol
basic).
:list-intro, in which case arg is a token and the function
should return non-nil if the token is followed by a list of
expressions (not separated by any token) rather than an expression.
When arg is a token, the function is called with point just before
that token. A return value of nil always means to fallback on the
default behavior, so the function should return nil for arguments it
does not expect.
offset can be:
nil: use the default indentation rule.
(column . column): indent to column column.
:after and its parent for :before.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
SMIE provides various functions designed specifically for use in the
indentation rules function (several of those functions break if used in
another context). These functions all start with the prefix
smie-rule-.
Return non-nil if the current token is the first on the line.
Return non-nil if the current token is hanging.
A token is hanging if it is the last token on the line
and if it is preceded by other tokens: a lone token on a line is not
hanging.
Return non-nil if the next token is among tokens.
Return non-nil if the previous token is among tokens.
Return non-nil if the current token’s parent is among parents.
Return non-nil if the current token’s parent is actually a
sibling. This is the case for example when the parent of a ","
is just the previous ",".
Return the proper offset to align the current token with the parent.
If non-nil, offset should be an integer giving an
additional offset to apply.
Indent current token as a separator.
By separator, we mean here a token whose sole purpose is to separate various elements within some enclosing syntactic construct, and which does not have any semantic significance in itself (i.e., it would typically not exist as a node in an abstract syntax tree).
Such a token is expected to have an associative syntax and be closely
tied to its syntactic parent. Typical examples are "," in lists
of arguments (enclosed inside parentheses), or ";" in sequences
of instructions (enclosed in a {...} or begin...end
block).
method should be the method name that was passed to ‘smie-rules-function’.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here is an example of an indentation function:
(defun sample-smie-rules (kind token)
(pcase (cons kind token)
(`(:elem . basic) sample-indent-basic)
(`(,_ . ",") (smie-rule-separator kind))
(`(:after . ":=") sample-indent-basic)
(`(:before . ,(or `"begin" `"(" `"{")))
(if (smie-rule-hanging-p) (smie-rule-parent)))
(`(:before . "if")
(and (not (smie-rule-bolp)) (smie-rule-prev-p "else")
(smie-rule-parent)))))
A few things to note:
sample-indent-basic is nil, then SMIE uses the global
setting smie-indent-basic. The major mode could have set
smie-indent-basic buffer-locally instead, but that
is discouraged.
"," make SMIE try to be more clever when
the comma separator is placed at the beginning of lines. It tries to
outdent the separator so as to align the code after the comma; for
example:
x = longfunctionname (
arg1
, arg2
);
":=" exists because otherwise
SMIE would treat ":=" as an infix operator and would align the
right argument with the left one.
"begin" is an example of the use
of virtual indentation: This rule is used only when "begin" is
hanging, which can happen only when "begin" is not at the
beginning of a line. So this is not used when indenting
"begin" itself but only when indenting something relative to this
"begin". Concretely, this rule changes the indentation from:
if x > 0 then begin
dosomething(x);
end
to
if x > 0 then begin
dosomething(x);
end
"if" is similar to the one for
"begin", but where the purpose is to treat "else if"
as a single unit, so as to align a sequence of tests rather than indent
each test further to the right. This function does this only in the
case where the "if" is not placed on a separate line, hence the
smie-rule-bolp test.
If we know that the "else" is always aligned with its "if"
and is always at the beginning of a line, we can use a more efficient
rule:
((equal token "if")
(and (not (smie-rule-bolp))
(smie-rule-prev-p "else")
(save-excursion
(sample-smie-backward-token)
(cons 'column (current-column)))))
The advantage of this formulation is that it reuses the indentation of
the previous "else", rather than going all the way back to the
first "if" of the sequence.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If you are using a mode whose indentation is provided by SMIE, you can
customize the indentation to suit your preferences. You can do this
on a per-mode basis (using the option smie-config), or a
per-file basis (using the function smie-config-local in a
file-local variable specification).
This option lets you customize indentation on a per-mode basis.
It is an alist with elements of the form (mode . rules).
For the precise form of rules, see the variable’s documentation; but
you may find it easier to use the command smie-config-guess.
This command tries to work out appropriate settings to produce your preferred style of indentation. Simply call the command while visiting a file that is indented with your style.
Call this command after using smie-config-guess, to save your
settings for future sessions.
This command displays the rules that are used to indent the current line.
This command adds a local rule to adjust the indentation of the current line.
This function adds rules as indentation rules for the current buffer.
These add to any mode-specific rules defined by the smie-config option.
To specify custom indentation rules for a specific file, add an entry
to the file’s local variables of the form:
eval: (smie-config-local '(rules)).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Desktop Save Mode is a feature to save the state of Emacs from one session to another. The user-level commands for using Desktop Save Mode are described in the GNU Emacs Manual (see Saving Emacs Sessions in the GNU Emacs Manual). Modes whose buffers visit a file, don’t have to do anything to use this feature.
For buffers not visiting a file to have their state saved, the major
mode must bind the buffer local variable desktop-save-buffer to
a non-nil value.
If this buffer-local variable is non-nil, the buffer will have
its state saved in the desktop file at desktop save. If the value is
a function, it is called at desktop save with argument
desktop-dirname, and its value is saved in the desktop file along
with the state of the buffer for which it was called. When file names
are returned as part of the auxiliary information, they should be
formatted using the call
(desktop-file-name file-name desktop-dirname)
For buffers not visiting a file to be restored, the major mode must
define a function to do the job, and that function must be listed in
the alist desktop-buffer-mode-handlers.
Alist with elements
(major-mode . restore-buffer-function)
The function restore-buffer-function will be called with argument list
(buffer-file-name buffer-name desktop-buffer-misc)
and it should return the restored buffer.
Here desktop-buffer-misc is the value returned by the function
optionally bound to desktop-save-buffer.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GNU Emacs has convenient built-in help facilities, most of which derive their information from documentation strings associated with functions and variables. This chapter describes how to access documentation strings in Lisp programs.
The contents of a documentation string should follow certain conventions. In particular, its first line should be a complete sentence (or two complete sentences) that briefly describes what the function or variable does. See section Tips for Documentation Strings, for how to write good documentation strings.
Note that the documentation strings for Emacs are not the same thing as the Emacs manual. Manuals have their own source files, written in the Texinfo language; documentation strings are specified in the definitions of the functions and variables they apply to. A collection of documentation strings is not sufficient as a manual because a good manual is not organized in that fashion; it is organized in terms of topics of discussion.
For commands to display documentation strings, see Help in The GNU Emacs Manual.
| 23.1 Documentation Basics | Where doc strings are defined and stored. | |
| 23.2 Access to Documentation Strings | How Lisp programs can access doc strings. | |
| 23.3 Substituting Key Bindings in Documentation | Substituting current key bindings. | |
| 23.4 Describing Characters for Help Messages | Making printable descriptions of non-printing characters and key sequences. | |
| 23.5 Help Functions | Subroutines used by Emacs help facilities. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A documentation string is written using the Lisp syntax for strings, with double-quote characters surrounding the text. It is, in fact, an actual Lisp string. When the string appears in the proper place in a function or variable definition, it serves as the function’s or variable’s documentation.
In a function definition (a lambda or defun form), the
documentation string is specified after the argument list, and is
normally stored directly in the function object. See section Documentation Strings of Functions. You can also put function documentation in the
function-documentation property of a function name
(see section Access to Documentation Strings).
In a variable definition (a defvar form), the documentation
string is specified after the initial value. See section Defining Global Variables. The string is stored in the variable’s
variable-documentation property.
Sometimes, Emacs does not keep documentation strings in memory.
There are two such circumstances. Firstly, to save memory, the
documentation for preloaded functions and variables (including
primitives) is kept in a file named DOC, in the directory
specified by doc-directory (see section Access to Documentation Strings).
Secondly, when a function or variable is loaded from a byte-compiled
file, Emacs avoids loading its documentation string (see section Documentation Strings and Compilation). In both cases, Emacs looks up the documentation string
from the file only when needed, such as when the user calls C-h
f (describe-function) for a function.
Documentation strings can contain special key substitution sequences, referring to key bindings which are looked up only when the user views the documentation. This allows the help commands to display the correct keys even if a user rearranges the default key bindings. See section Substituting Key Bindings in Documentation.
In the documentation string of an autoloaded command (see section Autoload), these key-substitution sequences have an additional special effect: they cause C-h f on the command to trigger autoloading. (This is needed for correctly setting up the hyperlinks in the *Help* buffer.)
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This function returns the documentation string recorded in
symbol’s property list under property property. It is
most often used to look up the documentation strings of variables, for
which property is variable-documentation. However, it
can also be used to look up other kinds of documentation, such as for
customization groups (but for function documentation, use the
documentation function, below).
If the property value refers to a documentation string stored in the DOC file or a byte-compiled file, this function looks up that string and returns it.
If the property value isn’t nil, isn’t a string, and doesn’t
refer to text in a file, then it is evaluated as a Lisp expression to
obtain a string.
Finally, this function passes the string through
substitute-command-keys to substitute key bindings (see section Substituting Key Bindings in Documentation). It skips this step if verbatim is
non-nil.
(documentation-property 'command-line-processed
'variable-documentation)
⇒ "Non-nil once command line has been processed"
(symbol-plist 'command-line-processed)
⇒ (variable-documentation 188902)
(documentation-property 'emacs 'group-documentation)
⇒ "Customization of the One True Editor."
This function returns the documentation string of function. It handles macros, named keyboard macros, and special forms, as well as ordinary functions.
If function is a symbol, this function first looks for the
function-documentation property of that symbol; if that has a
non-nil value, the documentation comes from that value (if the
value is not a string, it is evaluated).
If function is not a symbol, or if it has no
function-documentation property, then documentation
extracts the documentation string from the actual function definition,
reading it from a file if called for.
Finally, unless verbatim is non-nil, this function calls
substitute-command-keys. The result is the documentation
string to return.
The documentation function signals a void-function error
if function has no function definition. However, it is OK if
the function definition has no documentation string. In that case,
documentation returns nil.
This function returns the documentation string of face as a face.
Here is an example of using the two functions, documentation and
documentation-property, to display the documentation strings for
several symbols in a *Help* buffer.
(defun describe-symbols (pattern)
"Describe the Emacs Lisp symbols matching PATTERN.
All symbols that have PATTERN in their name are described
in the `*Help*' buffer."
(interactive "sDescribe symbols matching: ")
(let ((describe-func
(function
(lambda (s)
;; Print description of symbol. (if (fboundp s) ; It is a function. (princ (format "%s\t%s\n%s\n\n" s (if (commandp s) (let ((keys (where-is-internal s))) (if keys (concat "Keys: " (mapconcat 'key-description keys " ")) "Keys: none")) "Function")
(or (documentation s)
"not documented"))))
(if (boundp s) ; It is a variable.
(princ
(format "%s\t%s\n%s\n\n" s
(if (custom-variable-p s)
"Option " "Variable")
(or (documentation-property
s 'variable-documentation)
"not documented")))))))
sym-list)
;; Build a list of symbols that match pattern.
(mapatoms (function
(lambda (sym)
(if (string-match pattern (symbol-name sym))
(setq sym-list (cons sym sym-list))))))
;; Display the data.
(help-setup-xref (list 'describe-symbols pattern) (interactive-p))
(with-help-window (help-buffer)
(mapcar describe-func (sort sym-list 'string<)))))
The describe-symbols function works like apropos,
but provides more information.
(describe-symbols "goal") ---------- Buffer: *Help* ---------- goal-column Option Semipermanent goal column for vertical motion, as set by …
set-goal-column Keys: C-x C-n Set the current horizontal position as a goal for C-n and C-p.
Those commands will move to this position in the line moved to rather than trying to keep the same horizontal position. With a non-nil argument, clears out the goal column so that C-n and C-p resume vertical motion. The goal column is stored in the variable `goal-column'.
temporary-goal-column Variable Current goal column for vertical motion. It is the column where point was at the start of current run of vertical motion commands. When the `track-eol' feature is doing its job, the value is 9999. ---------- Buffer: *Help* ----------
This function is used when building Emacs, just before the runnable Emacs is dumped. It finds the positions of the documentation strings stored in the file filename, and records those positions into memory in the function definitions and variable property lists. See section Building Emacs.
Emacs reads the file filename from the emacs/etc directory.
When the dumped Emacs is later executed, the same file will be looked
for in the directory doc-directory. Usually filename is
"DOC".
This variable holds the name of the directory which should contain the
file "DOC" that contains documentation strings for
built-in and preloaded functions and variables.
In most cases, this is the same as data-directory. They may be
different when you run Emacs from the directory where you built it,
without actually installing it. See Definition of data-directory.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When documentation strings refer to key sequences, they should use the
current, actual key bindings. They can do so using certain special text
sequences described below. Accessing documentation strings in the usual
way substitutes current key binding information for these special
sequences. This works by calling substitute-command-keys. You
can also call that function yourself.
Here is a list of the special sequences and what they mean:
\[command]stands for a key sequence that will invoke command, or ‘M-x command’ if command has no key bindings.
\{mapvar}stands for a summary of the keymap which is the value of the variable
mapvar. The summary is made using describe-bindings.
\<mapvar>stands for no text itself. It is used only for a side effect: it specifies mapvar’s value as the keymap for any following ‘\[command]’ sequences in this documentation string.
\=quotes the following character and is discarded; thus, ‘\=\[’ puts ‘\[’ into the output, and ‘\=\=’ puts ‘\=’ into the output.
Please note: Each ‘\’ must be doubled when written in a string in Emacs Lisp.
This function scans string for the above special sequences and replaces them by what they stand for, returning the result as a string. This permits display of documentation that refers accurately to the user’s own customized key bindings.
If a command has multiple bindings, this function normally uses the
first one it finds. You can specify one particular key binding by
assigning an :advertised-binding symbol property to the
command, like this:
(put 'undo :advertised-binding [?\C-/])
The :advertised-binding property also affects the binding shown
in menu items (see section The Menu Bar). The property is ignored if it
specifies a key binding that the command does not actually have.
Here are examples of the special sequences:
(substitute-command-keys "To abort recursive edit, type: \\[abort-recursive-edit]") ⇒ "To abort recursive edit, type: C-]"
(substitute-command-keys
"The keys that are defined for the minibuffer here are:
\\{minibuffer-local-must-match-map}")
⇒ "The keys that are defined for the minibuffer here are:
? minibuffer-completion-help SPC minibuffer-complete-word TAB minibuffer-complete C-j minibuffer-complete-and-exit RET minibuffer-complete-and-exit C-g abort-recursive-edit "
(substitute-command-keys "To abort a recursive edit from the minibuffer, type\ \\<minibuffer-local-must-match-map>\\[abort-recursive-edit].") ⇒ "To abort a recursive edit from the minibuffer, type C-g."
There are other special conventions for the text in documentation strings—for instance, you can refer to functions, variables, and sections of this manual. See section Tips for Documentation Strings, for details.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These functions convert events, key sequences, or characters to textual descriptions. These descriptions are useful for including arbitrary text characters or key sequences in messages, because they convert non-printing and whitespace characters to sequences of printing characters. The description of a non-whitespace printing character is the character itself.
This function returns a string containing the Emacs standard notation
for the input events in sequence. If prefix is
non-nil, it is a sequence of input events leading up to
sequence and is included in the return value. Both arguments
may be strings, vectors or lists. See section Input Events, for more
information about valid events.
(key-description [?\M-3 delete])
⇒ "M-3 <delete>"
(key-description [delete] "\M-3")
⇒ "M-3 <delete>"
See also the examples for single-key-description, below.
This function returns a string describing event in the standard Emacs notation for keyboard input. A normal printing character appears as itself, but a control character turns into a string starting with ‘C-’, a meta character turns into a string starting with ‘M-’, and space, tab, etc., appear as ‘SPC’, ‘TAB’, etc. A function key symbol appears inside angle brackets ‘<…>’. An event that is a list appears as the name of the symbol in the CAR of the list, inside angle brackets.
If the optional argument no-angles is non-nil, the angle
brackets around function keys and event symbols are omitted; this is
for compatibility with old versions of Emacs which didn’t use the
brackets.
(single-key-description ?\C-x)
⇒ "C-x"
(key-description "\C-x \M-y \n \t \r \f123")
⇒ "C-x SPC M-y SPC C-j SPC TAB SPC RET SPC C-l 1 2 3"
(single-key-description 'delete)
⇒ "<delete>"
(single-key-description 'C-mouse-1)
⇒ "<C-mouse-1>"
(single-key-description 'C-mouse-1 t)
⇒ "C-mouse-1"
This function returns a string describing character in the
standard Emacs notation for characters that appear in text—like
single-key-description, except that control characters are
represented with a leading caret (which is how control characters in
Emacs buffers are usually displayed). Another difference is that
text-char-description recognizes the 2**7 bit as the Meta
character, whereas single-key-description uses the 2**27 bit
for Meta.
(text-char-description ?\C-c)
⇒ "^C"
(text-char-description ?\M-m)
⇒ "\xed"
(text-char-description ?\C-\M-m)
⇒ "\x8d"
(text-char-description (+ 128 ?m))
⇒ "M-m"
(text-char-description (+ 128 ?\C-m))
⇒ "M-^M"
This function is used mainly for operating on keyboard macros, but it
can also be used as a rough inverse for key-description. You
call it with a string containing key descriptions, separated by spaces;
it returns a string or vector containing the corresponding events.
(This may or may not be a single valid key sequence, depending on what
events you use; see section Key Sequences.) If need-vector is
non-nil, the return value is always a vector.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs provides a variety of built-in help functions, all accessible to the user as subcommands of the prefix C-h. For more information about them, see Help in The GNU Emacs Manual. Here we describe some program-level interfaces to the same information.
This function finds all “meaningful” symbols whose names contain a match for the apropos pattern pattern. An apropos pattern is either a word to match, a space-separated list of words of which at least two must match, or a regular expression (if any special regular expression characters occur). A symbol is “meaningful” if it has a definition as a function, variable, or face, or has properties.
The function returns a list of elements that look like this:
(symbol score function-doc variable-doc plist-doc widget-doc face-doc group-doc)
Here, score is an integer measure of how important the symbol
seems to be as a match. Each of the remaining elements is a
documentation string, or nil, for symbol as a function,
variable, etc.
It also displays the symbols in a buffer named *Apropos*, each with a one-line description taken from the beginning of its documentation string.
If do-all is non-nil, or if the user option
apropos-do-all is non-nil, then apropos also
shows key bindings for the functions that are found; it also shows
all interned symbols, not just meaningful ones (and it lists
them in the return value as well).
The value of this variable is a local keymap for characters following the Help key, C-h.
This symbol is not a function; its function definition cell holds the
keymap known as help-map. It is defined in help.el as
follows:
(define-key global-map (string help-char) 'help-command) (fset 'help-command help-map)
The value of this variable is the help character—the character that
Emacs recognizes as meaning Help. By default, its value is 8, which
stands for C-h. When Emacs reads this character, if
help-form is a non-nil Lisp expression, it evaluates that
expression, and displays the result in a window if it is a string.
Usually the value of help-form is nil. Then the
help character has no special meaning at the level of command input, and
it becomes part of a key sequence in the normal way. The standard key
binding of C-h is a prefix key for several general-purpose help
features.
The help character is special after prefix keys, too. If it has no
binding as a subcommand of the prefix key, it runs
describe-prefix-bindings, which displays a list of all the
subcommands of the prefix key.
The value of this variable is a list of event types that serve as
alternative “help characters”. These events are handled just like the
event specified by help-char.
If this variable is non-nil, its value is a form to evaluate
whenever the character help-char is read. If evaluating the form
produces a string, that string is displayed.
A command that calls read-event, read-char-choice, or
read-char probably should bind help-form to a
non-nil expression while it does input. (The time when you
should not do this is when C-h has some other meaning.)
Evaluating this expression should result in a string that explains
what the input is for and how to enter it properly.
Entry to the minibuffer binds this variable to the value of
minibuffer-help-form (see Definition of minibuffer-help-form).
This variable holds a function to print help for a prefix key. The
function is called when the user types a prefix key followed by the help
character, and the help character has no binding after that prefix. The
variable’s default value is describe-prefix-bindings.
This function calls describe-bindings to display a list of all
the subcommands of the prefix key of the most recent key sequence. The
prefix described consists of all but the last event of that key
sequence. (The last event is, presumably, the help character.)
The following two functions are meant for modes that want to provide help without relinquishing control, such as the “electric” modes. Their names begin with ‘Helper’ to distinguish them from the ordinary help functions.
This command pops up a window displaying a help buffer containing a
listing of all of the key bindings from both the local and global keymaps.
It works by calling describe-bindings.
This command provides help for the current mode. It prompts the user
in the minibuffer with the message ‘Help (Type ? for further
options)’, and then provides assistance in finding out what the key
bindings are, and what the mode is intended for. It returns nil.
This can be customized by changing the map Helper-help-map.
This variable holds the name of the directory in which Emacs finds certain documentation and text files that come with Emacs.
This function returns the name of the help buffer, which is normally *Help*; if such a buffer does not exist, it is first created.
This macro evaluates body like with-output-to-temp-buffer
(see section Temporary Displays), inserting any output produced by its forms
into a buffer named buffer-name. (Usually, buffer-name
should be the value returned by the function help-buffer.) It
also puts the specified buffer into Help mode and displays a message
telling the user how to quit and scroll the help window. It selects the
help window if the current value of the user option
help-window-select has been set accordingly. It returns the last
value in body.
This function updates the cross reference data in the *Help*
buffer, which is used to regenerate the help information when the user
clicks on the ‘Back’ or ‘Forward’ buttons. Most commands
that use the *Help* buffer should invoke this function before
clearing the buffer. The item argument should have the form
(function . args), where function is a function
to call, with argument list args, to regenerate the help buffer.
The interactive-p argument is non-nil if the calling
command was invoked interactively; in that case, the stack of items
for the *Help* buffer’s ‘Back’ buttons is cleared.
See describe-symbols example, for an example of using
help-buffer, with-help-window, and
help-setup-xref.
This macro defines a help command named fname that acts like a prefix key that shows a list of the subcommands it offers.
When invoked, fname displays help-text in a window, then reads and executes a key sequence according to help-map. The string help-text should describe the bindings available in help-map.
The command fname is defined to handle a few events itself, by scrolling the display of help-text. When fname reads one of those special events, it does the scrolling and then reads another event. When it reads an event that is not one of those few, and which has a binding in help-map, it executes that key’s binding and then returns.
The argument help-line should be a single-line summary of the
alternatives in help-map. In the current version of Emacs, this
argument is used only if you set the option three-step-help to
t.
This macro is used in the command help-for-help which is the
binding of C-h C-h.
If this variable is non-nil, commands defined with
make-help-screen display their help-line strings in the
echo area at first, and display the longer help-text strings only
if the user types the help character again.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This chapter describes the Emacs Lisp functions and variables to find, create, view, save, and otherwise work with files and directories. A few other file-related functions are described in Buffers, and those related to backups and auto-saving are described in Backups and Auto-Saving.
Many of the file functions take one or more arguments that are file
names. A file name is a string. Most of these functions expand file
name arguments using the function expand-file-name, so that
~ is handled correctly, as are relative file names (including
../). See section Functions that Expand Filenames.
In addition, certain magic file names are handled specially. For example, when a remote file name is specified, Emacs accesses the file over the network via an appropriate protocol. See Remote Files in The GNU Emacs Manual. This handling is done at a very low level, so you may assume that all the functions described in this chapter accept magic file names as file name arguments, except where noted. See section Making Certain File Names “Magic”, for details.
When file I/O functions signal Lisp errors, they usually use the
condition file-error (see section Writing Code to Handle Errors). The error
message is in most cases obtained from the operating system, according
to locale system-messages-locale, and decoded using coding system
locale-coding-system (see section Locales).
| 24.1 Visiting Files | Reading files into Emacs buffers for editing. | |
| 24.2 Saving Buffers | Writing changed buffers back into files. | |
| 24.3 Reading from Files | Reading files into buffers without visiting. | |
| 24.4 Writing to Files | Writing new files from parts of buffers. | |
| 24.5 File Locks | Locking and unlocking files, to prevent simultaneous editing by two people. | |
| 24.6 Information about Files | Testing existence, accessibility, size of files. | |
| 24.7 Changing File Names and Attributes | Renaming files, changing permissions, etc. | |
| 24.8 File Names | Decomposing and expanding file names. | |
| 24.9 Contents of Directories | Getting a list of the files in a directory. | |
| 24.10 Creating, Copying and Deleting Directories | Creating and Deleting Directories. | |
| 24.11 Making Certain File Names “Magic” | Special handling for certain file names. | |
| 24.12 File Format Conversion | Conversion to and from various file formats. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Visiting a file means reading a file into a buffer. Once this is done, we say that the buffer is visiting that file, and call the file “the visited file” of the buffer.
A file and a buffer are two different things. A file is information recorded permanently in the computer (unless you delete it). A buffer, on the other hand, is information inside of Emacs that will vanish at the end of the editing session (or when you kill the buffer). When a buffer is visiting a file, it contains information copied from the file. The copy in the buffer is what you modify with editing commands. Changes to the buffer do not change the file; to make the changes permanent, you must save the buffer, which means copying the altered buffer contents back into the file.
Despite the distinction between files and buffers, people often refer to a file when they mean a buffer and vice-versa. Indeed, we say, “I am editing a file”, rather than, “I am editing a buffer that I will soon save as a file of the same name”. Humans do not usually need to make the distinction explicit. When dealing with a computer program, however, it is good to keep the distinction in mind.
| 24.1.1 Functions for Visiting Files | The usual interface functions for visiting. | |
| 24.1.2 Subroutines of Visiting | Lower-level subroutines that they use. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes the functions normally used to visit files. For historical reasons, these functions have names starting with ‘find-’ rather than ‘visit-’. See section Buffer File Name, for functions and variables that access the visited file name of a buffer or that find an existing buffer by its visited file name.
In a Lisp program, if you want to look at the contents of a file but
not alter it, the fastest way is to use insert-file-contents in a
temporary buffer. Visiting the file is not necessary and takes longer.
See section Reading from Files.
This command selects a buffer visiting the file filename, using an existing buffer if there is one, and otherwise creating a new buffer and reading the file into it. It also returns that buffer.
Aside from some technical details, the body of the find-file
function is basically equivalent to:
(switch-to-buffer (find-file-noselect filename nil nil wildcards))
(See switch-to-buffer in Switching to a Buffer in a Window.)
If wildcards is non-nil, which is always true in an
interactive call, then find-file expands wildcard characters in
filename and visits all the matching files.
When find-file is called interactively, it prompts for
filename in the minibuffer.
This command visits filename, like find-file does, but it
does not perform any format conversions (see section File Format Conversion),
character code conversions (see section Coding Systems), or end-of-line
conversions (see section End of line conversion).
The buffer visiting the file is made unibyte, and its major mode is
Fundamental mode, regardless of the file name. File local variable
specifications in the file (see section File Local Variables) are
ignored, and automatic decompression and adding a newline at the end
of the file due to require-final-newline (see section require-final-newline) are also disabled.
Note that if Emacs already has a buffer visiting the same file
non-literally, it will not visit the same file literally, but instead
just switch to the existing buffer. If you want to be sure of
accessing a file’s contents literally, you should create a temporary
buffer and then read the file contents into it using
insert-file-contents-literally (see section Reading from Files).
This function is the guts of all the file-visiting functions. It returns a buffer visiting the file filename. You may make the buffer current or display it in a window if you wish, but this function does not do so.
The function returns an existing buffer if there is one; otherwise it
creates a new buffer and reads the file into it. When
find-file-noselect uses an existing buffer, it first verifies
that the file has not changed since it was last visited or saved in
that buffer. If the file has changed, this function asks the user
whether to reread the changed file. If the user says ‘yes’, any
edits previously made in the buffer are lost.
Reading the file involves decoding the file’s contents (see section Coding Systems), including end-of-line conversion, and format conversion
(see section File Format Conversion). If wildcards is non-nil,
then find-file-noselect expands wildcard characters in
filename and visits all the matching files.
This function displays warning or advisory messages in various peculiar
cases, unless the optional argument nowarn is non-nil. For
example, if it needs to create a buffer, and there is no file named
filename, it displays the message ‘(New file)’ in the echo
area, and leaves the buffer empty.
The find-file-noselect function normally calls
after-find-file after reading the file (see section Subroutines of Visiting). That function sets the buffer major mode, parses local
variables, warns the user if there exists an auto-save file more recent
than the file just visited, and finishes by running the functions in
find-file-hook.
If the optional argument rawfile is non-nil, then
after-find-file is not called, and the
find-file-not-found-functions are not run in case of failure.
What’s more, a non-nil rawfile value suppresses coding
system conversion and format conversion.
The find-file-noselect function usually returns the buffer that
is visiting the file filename. But, if wildcards are actually
used and expanded, it returns a list of buffers that are visiting the
various files.
(find-file-noselect "/etc/fstab")
⇒ #<buffer fstab>
This command selects a buffer visiting the file filename, but does so in a window other than the selected window. It may use another existing window or split a window; see Switching to a Buffer in a Window.
When this command is called interactively, it prompts for filename.
This command selects a buffer visiting the file filename, like
find-file, but it marks the buffer as read-only. See section Read-Only Buffers, for related functions and variables.
When this command is called interactively, it prompts for filename.
If this variable is non-nil, then the various find-file
commands check for wildcard characters and visit all the files that
match them (when invoked interactively or when their wildcards
argument is non-nil). If this option is nil, then
the find-file commands ignore their wildcards argument
and never treat wildcard characters specially.
The value of this variable is a list of functions to be called after a file is visited. The file’s local-variables specification (if any) will have been processed before the hooks are run. The buffer visiting the file is current when the hook functions are run.
This variable is a normal hook. See section Hooks.
The value of this variable is a list of functions to be called when
find-file or find-file-noselect is passed a nonexistent
file name. find-file-noselect calls these functions as soon as
it detects a nonexistent file. It calls them in the order of the list,
until one of them returns non-nil. buffer-file-name is
already set up.
This is not a normal hook because the values of the functions are used, and in many cases only some of the functions are called.
This buffer-local variable, if set to a non-nil value, makes
save-buffer behave as if the buffer were visiting its file
literally, i.e., without conversions of any kind. The command
find-file-literally sets this variable’s local value, but other
equivalent functions and commands can do that as well, e.g., to avoid
automatic addition of a newline at the end of the file. This variable
is permanent local, so it is unaffected by changes of major modes.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The find-file-noselect function uses two important subroutines
which are sometimes useful in user Lisp code: create-file-buffer
and after-find-file. This section explains how to use them.
This function creates a suitably named buffer for visiting filename, and returns it. It uses filename (sans directory) as the name if that name is free; otherwise, it appends a string such as ‘<2>’ to get an unused name. See also Creating Buffers. Note that the uniquify library affects the result of this function. See Uniquify in The GNU Emacs Manual.
Please note: create-file-buffer does not
associate the new buffer with a file and does not select the buffer.
It also does not use the default major mode.
(create-file-buffer "foo")
⇒ #<buffer foo>
(create-file-buffer "foo")
⇒ #<buffer foo<2>>
(create-file-buffer "foo")
⇒ #<buffer foo<3>>
This function is used by find-file-noselect.
It uses generate-new-buffer (see section Creating Buffers).
This function sets the buffer major mode, and parses local variables
(see section How Emacs Chooses a Major Mode). It is called by find-file-noselect
and by the default revert function (see section Reverting).
If reading the file got an error because the file does not exist, but
its directory does exist, the caller should pass a non-nil value
for error. In that case, after-find-file issues a warning:
‘(New file)’. For more serious errors, the caller should usually not
call after-find-file.
If warn is non-nil, then this function issues a warning
if an auto-save file exists and is more recent than the visited file.
If noauto is non-nil, that says not to enable or disable
Auto-Save mode. The mode remains enabled if it was enabled before.
If after-find-file-from-revert-buffer is non-nil, that
means this call was from revert-buffer. This has no direct
effect, but some mode functions and hook functions check the value
of this variable.
If nomodes is non-nil, that means don’t alter the buffer’s
major mode, don’t process local variables specifications in the file,
and don’t run find-file-hook. This feature is used by
revert-buffer in some cases.
The last thing after-find-file does is call all the functions
in the list find-file-hook.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When you edit a file in Emacs, you are actually working on a buffer that is visiting that file—that is, the contents of the file are copied into the buffer and the copy is what you edit. Changes to the buffer do not change the file until you save the buffer, which means copying the contents of the buffer into the file.
This function saves the contents of the current buffer in its visited file if the buffer has been modified since it was last visited or saved. Otherwise it does nothing.
save-buffer is responsible for making backup files. Normally,
backup-option is nil, and save-buffer makes a backup
file only if this is the first save since visiting the file. Other
values for backup-option request the making of backup files in
other circumstances:
save-buffer function marks this version of the file to be
backed up when the buffer is next saved.
save-buffer function unconditionally backs up the previous
version of the file before saving it.
This command saves some modified file-visiting buffers. Normally it
asks the user about each buffer. But if save-silently-p is
non-nil, it saves all the file-visiting buffers without querying
the user.
The optional pred argument controls which buffers to ask about
(or to save silently if save-silently-p is non-nil).
If it is nil, that means to ask only about file-visiting buffers.
If it is t, that means also offer to save certain other non-file
buffers—those that have a non-nil buffer-local value of
buffer-offer-save (see section Killing Buffers). A user who says
‘yes’ to saving a non-file buffer is asked to specify the file
name to use. The save-buffers-kill-emacs function passes the
value t for pred.
If pred is neither t nor nil, then it should be
a function of no arguments. It will be called in each buffer to decide
whether to offer to save that buffer. If it returns a non-nil
value in a certain buffer, that means do offer to save that buffer.
This function writes the current buffer into file filename, makes
the buffer visit that file, and marks it not modified. Then it renames
the buffer based on filename, appending a string like ‘<2>’
if necessary to make a unique buffer name. It does most of this work by
calling set-visited-file-name (see section Buffer File Name) and
save-buffer.
If confirm is non-nil, that means to ask for confirmation
before overwriting an existing file. Interactively, confirmation is
required, unless the user supplies a prefix argument.
If filename is an existing directory, or a symbolic link to one,
write-file uses the name of the visited file, in directory
filename. If the buffer is not visiting a file, it uses the
buffer name instead.
Saving a buffer runs several hooks. It also performs format conversion (see section File Format Conversion).
The value of this variable is a list of functions to be called before
writing out a buffer to its visited file. If one of them returns
non-nil, the file is considered already written and the rest of
the functions are not called, nor is the usual code for writing the file
executed.
If a function in write-file-functions returns non-nil, it
is responsible for making a backup file (if that is appropriate).
To do so, execute the following code:
(or buffer-backed-up (backup-buffer))
You might wish to save the file modes value returned by
backup-buffer and use that (if non-nil) to set the mode
bits of the file that you write. This is what save-buffer
normally does. See section Making Backup Files.
The hook functions in write-file-functions are also responsible
for encoding the data (if desired): they must choose a suitable coding
system and end-of-line conversion (see section Coding Systems in Lisp),
perform the encoding (see section Explicit Encoding and Decoding), and set
last-coding-system-used to the coding system that was used
(see section Encoding and I/O).
If you set this hook locally in a buffer, it is assumed to be
associated with the file or the way the contents of the buffer were
obtained. Thus the variable is marked as a permanent local, so that
changing the major mode does not alter a buffer-local value. On the
other hand, calling set-visited-file-name will reset it.
If this is not what you want, you might like to use
write-contents-functions instead.
Even though this is not a normal hook, you can use add-hook and
remove-hook to manipulate the list. See section Hooks.
This works just like write-file-functions, but it is intended
for hooks that pertain to the buffer’s contents, not to the particular
visited file or its location. Such hooks are usually set up by major
modes, as buffer-local bindings for this variable. This variable
automatically becomes buffer-local whenever it is set; switching to a
new major mode always resets this variable, but calling
set-visited-file-name does not.
If any of the functions in this hook returns non-nil, the file
is considered already written and the rest are not called and neither
are the functions in write-file-functions.
This normal hook runs before a buffer is saved in its visited file, regardless of whether that is done normally or by one of the hooks described above. For instance, the copyright.el program uses this hook to make sure the file you are saving has the current year in its copyright notice.
This normal hook runs after a buffer has been saved in its visited file. One use of this hook is in Fast Lock mode; it uses this hook to save the highlighting information in a cache file.
If this variable is non-nil, then save-buffer protects
against I/O errors while saving by writing the new file to a temporary
name instead of the name it is supposed to have, and then renaming it to
the intended name after it is clear there are no errors. This procedure
prevents problems such as a lack of disk space from resulting in an
invalid file.
As a side effect, backups are necessarily made by copying. See section Backup by Renaming or by Copying?. Yet, at the same time, saving a precious file always breaks all hard links between the file you save and other file names.
Some modes give this variable a non-nil buffer-local value
in particular buffers.
This variable determines whether files may be written out that do
not end with a newline. If the value of the variable is
t, then save-buffer silently adds a newline at the end
of the buffer whenever it does not already end in one. If the value
is visit, Emacs adds a missing newline just after it visits the
file. If the value is visit-save, Emacs adds a missing newline
both on visiting and on saving. For any other non-nil value,
save-buffer asks the user whether to add a newline each time
the case arises.
If the value of the variable is nil, then save-buffer
doesn’t add newlines at all. nil is the default value, but a few
major modes set it to t in particular buffers.
See also the function set-visited-file-name (see section Buffer File Name).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To copy the contents of a file into a buffer, use the function
insert-file-contents. (Don’t use the command
insert-file in a Lisp program, as that sets the mark.)
This function inserts the contents of file filename into the current buffer after point. It returns a list of the absolute file name and the length of the data inserted. An error is signaled if filename is not the name of a file that can be read.
This function checks the file contents against the defined file
formats, and converts the file contents if appropriate and also calls
the functions in the list after-insert-file-functions.
See section File Format Conversion. Normally, one of the functions in the
after-insert-file-functions list determines the coding system
(see section Coding Systems) used for decoding the file’s contents,
including end-of-line conversion. However, if the file contains null
bytes, it is by default visited without any code conversions.
See section inhibit-null-byte-detection.
If visit is non-nil, this function additionally marks the
buffer as unmodified and sets up various fields in the buffer so that it
is visiting the file filename: these include the buffer’s visited
file name and its last save file modtime. This feature is used by
find-file-noselect and you probably should not use it yourself.
If beg and end are non-nil, they should be numbers
that are byte offsets specifying the portion of the file to insert.
In this case, visit must be nil. For example,
(insert-file-contents filename nil 0 500)
inserts the first 500 characters of a file.
If the argument replace is non-nil, it means to replace the
contents of the buffer (actually, just the accessible portion) with the
contents of the file. This is better than simply deleting the buffer
contents and inserting the whole file, because (1) it preserves some
marker positions and (2) it puts less data in the undo list.
It is possible to read a special file (such as a FIFO or an I/O device)
with insert-file-contents, as long as replace and
visit are nil.
This function works like insert-file-contents except that it
does not run find-file-hook, and does not do format decoding,
character code conversion, automatic uncompression, and so on.
If you want to pass a file name to another process so that another
program can read the file, use the function file-local-copy; see
Making Certain File Names “Magic”.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can write the contents of a buffer, or part of a buffer, directly
to a file on disk using the append-to-file and
write-region functions. Don’t use these functions to write to
files that are being visited; that could cause confusion in the
mechanisms for visiting.
This function appends the contents of the region delimited by
start and end in the current buffer to the end of file
filename. If that file does not exist, it is created. This
function returns nil.
An error is signaled if filename specifies a nonwritable file, or a nonexistent file in a directory where files cannot be created.
When called from Lisp, this function is completely equivalent to:
(write-region start end filename t)
This function writes the region delimited by start and end in the current buffer into the file specified by filename.
If start is nil, then the command writes the entire buffer
contents (not just the accessible portion) to the file and
ignores end.
If start is a string, then write-region writes or appends
that string, rather than text from the buffer. end is ignored in
this case.
If append is non-nil, then the specified text is appended
to the existing file contents (if any). If append is a
number, write-region seeks to that byte offset from the start
of the file and writes the data from there.
If mustbenew is non-nil, then write-region asks
for confirmation if filename names an existing file. If
mustbenew is the symbol excl, then write-region
does not ask for confirmation, but instead it signals an error
file-already-exists if the file already exists.
The test for an existing file, when mustbenew is excl, uses
a special system feature. At least for files on a local disk, there is
no chance that some other program could create a file of the same name
before Emacs does, without Emacs’s noticing.
If visit is t, then Emacs establishes an association
between the buffer and the file: the buffer is then visiting that file.
It also sets the last file modification time for the current buffer to
filename’s modtime, and marks the buffer as not modified. This
feature is used by save-buffer, but you probably should not use
it yourself.
If visit is a string, it specifies the file name to visit. This
way, you can write the data to one file (filename) while recording
the buffer as visiting another file (visit). The argument
visit is used in the echo area message and also for file locking;
visit is stored in buffer-file-name. This feature is used
to implement file-precious-flag; don’t use it yourself unless you
really know what you’re doing.
The optional argument lockname, if non-nil, specifies the
file name to use for purposes of locking and unlocking, overriding
filename and visit for that purpose.
The function write-region converts the data which it writes to
the appropriate file formats specified by buffer-file-format
and also calls the functions in the list
write-region-annotate-functions.
See section File Format Conversion.
Normally, write-region displays the message ‘Wrote
filename’ in the echo area. If visit is neither t
nor nil nor a string, then this message is inhibited. This
feature is useful for programs that use files for internal purposes,
files that the user does not need to know about.
The with-temp-file macro evaluates the body forms with a
temporary buffer as the current buffer; then, at the end, it writes the
buffer contents into file file. It kills the temporary buffer
when finished, restoring the buffer that was current before the
with-temp-file form. Then it returns the value of the last form
in body.
The current buffer is restored even in case of an abnormal exit via
throw or error (see section Nonlocal Exits).
See also with-temp-buffer in The Current Buffer.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When two users edit the same file at the same time, they are likely to interfere with each other. Emacs tries to prevent this situation from arising by recording a file lock when a file is being modified. Emacs can then detect the first attempt to modify a buffer visiting a file that is locked by another Emacs job, and ask the user what to do. The file lock is really a file, a symbolic link with a special name, stored in the same directory as the file you are editing. (On file systems that do not support symbolic links, a regular file is used.)
When you access files using NFS, there may be a small probability that you and another user will both lock the same file “simultaneously”. If this happens, it is possible for the two users to make changes simultaneously, but Emacs will still warn the user who saves second. Also, the detection of modification of a buffer visiting a file changed on disk catches some cases of simultaneous editing; see Buffer Modification Time.
This function returns nil if the file filename is not
locked. It returns t if it is locked by this Emacs process, and
it returns the name of the user who has locked it if it is locked by
some other job.
(file-locked-p "foo")
⇒ nil
This function locks the file filename, if the current buffer is modified. The argument filename defaults to the current buffer’s visited file. Nothing is done if the current buffer is not visiting a file, or is not modified, or if the system does not support locking.
This function unlocks the file being visited in the current buffer, if the buffer is modified. If the buffer is not modified, then the file should not be locked, so this function does nothing. It also does nothing if the current buffer is not visiting a file, or if the system does not support locking.
If this variable is nil, Emacs does not lock files.
This function is called when the user tries to modify file, but it is locked by another user named other-user. The default definition of this function asks the user to say what to do. The value this function returns determines what Emacs does next:
t says to grab the lock on the file. Then
this user may edit the file and other-user loses the lock.
nil says to ignore the lock and let this
user edit the file anyway.
file-locked error, in which
case the change that the user was about to make does not take place.
The error message for this error looks like this:
error→ File is locked: file other-user
where file is the name of the file and other-user is the
name of the user who has locked the file.
If you wish, you can replace the ask-user-about-lock function
with your own version that makes the decision in another way.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes the functions for retrieving various types of information about files (or directories or symbolic links), such as whether a file is readable or writable, and its size. These functions all take arguments which are file names. Except where noted, these arguments need to specify existing files, or an error is signaled.
Be careful with file names that end in spaces. On some filesystems (notably, MS-Windows), trailing whitespace characters in file names are silently and automatically ignored.
| 24.6.1 Testing Accessibility | Is a given file readable? Writable? | |
| 24.6.2 Distinguishing Kinds of Files | Is it a directory? A symbolic link? | |
| 24.6.3 Truenames | Eliminating symbolic links from a file name. | |
| 24.6.4 File Attributes | File sizes, modification times, etc. | |
| 24.6.5 Extended File Attributes | Extended file attributes for access control. | |
| 24.6.6 Locating Files in Standard Places | How to find a file in standard places. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These functions test for permission to access a file for reading, writing, or execution. Unless explicitly stated otherwise, they recursively follow symbolic links for their file name arguments, at all levels (at the level of the file itself and at all levels of parent directories).
On some operating systems, more complex sets of access permissions can be specified, via mechanisms such as Access Control Lists (ACLs). See section Extended File Attributes, for how to query and set those permissions.
This function returns t if a file named filename appears
to exist. This does not mean you can necessarily read the file, only
that you can find out its attributes. (On Unix and GNU/Linux, this is
true if the file exists and you have execute permission on the
containing directories, regardless of the permissions of the file
itself.)
If the file does not exist, or if access control policies prevent you
from finding its attributes, this function returns nil.
Directories are files, so file-exists-p returns t when
given a directory name. However, symbolic links are treated
specially; file-exists-p returns t for a symbolic link
name only if the target file exists.
This function returns t if a file named filename exists
and you can read it. It returns nil otherwise.
This function returns t if a file named filename exists and
you can execute it. It returns nil otherwise. On Unix and
GNU/Linux, if the file is a directory, execute permission means you can
check the existence and attributes of files inside the directory, and
open those files if their modes permit.
This function returns t if the file filename can be written
or created by you, and nil otherwise. A file is writable if the
file exists and you can write it. It is creatable if it does not exist,
but the specified directory does exist and you can write in that
directory.
In the example below, foo is not writable because the parent directory does not exist, even though the user could create such a directory.
(file-writable-p "~/no-such-dir/foo")
⇒ nil
This function returns t if you have permission to open existing
files in the directory whose name as a file is dirname;
otherwise (or if there is no such directory), it returns nil.
The value of dirname may be either a directory name (such as
/foo/) or the file name of a file which is a directory
(such as /foo, without the final slash).
For example, from the following we deduce that any attempt to read a file in /foo/ will give an error:
(file-accessible-directory-p "/foo")
⇒ nil
This function opens file filename for reading, then closes it and
returns nil. However, if the open fails, it signals an error
using string as the error message text.
This function returns t if deleting the file filename and
then creating it anew would keep the file’s owner unchanged. It also
returns t for nonexistent files.
If the optional argument group is non-nil, this function
also checks that the file’s group would be unchanged.
If filename is a symbolic link, then, unlike the other functions
discussed here, file-ownership-preserved-p does not
replace filename with its target. However, it does recursively
follow symbolic links at all levels of parent directories.
This function returns the mode bits of filename—an
integer summarizing its read, write, and execution permissions.
Symbolic links in filename are recursively followed at all
levels. If the file does not exist, the return value is nil.
See File permissions in The GNU Coreutils
Manual, for a description of mode bits. For example, if the
low-order bit is 1, the file is executable by all users; if the
second-lowest-order bit is 1, the file is writable by all users; etc.
The highest possible value is 4095 (7777 octal), meaning that everyone
has read, write, and execute permission, the SUID bit is set
for both others and group, and the sticky bit is set.
See section Changing File Names and Attributes, for the set-file-modes function, which
can be used to set these permissions.
(file-modes "~/junk/diffs")
⇒ 492 ; Decimal integer.
(format "%o" 492)
⇒ "754" ; Convert to octal.
(set-file-modes "~/junk/diffs" #o666)
⇒ nil
$ ls -l diffs -rw-rw-rw- 1 lewis lewis 3063 Oct 30 16:00 diffs
MS-DOS note: On MS-DOS, there is no such thing as an
“executable” file mode bit. So file-modes considers a file
executable if its name ends in one of the standard executable
extensions, such as .com, .bat, .exe, and some
others. Files that begin with the Unix-standard ‘#!’ signature,
such as shell and Perl scripts, are also considered executable.
Directories are also reported as executable, for compatibility with
Unix. These conventions are also followed by file-attributes
(see section File Attributes).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes how to distinguish various kinds of files, such as directories, symbolic links, and ordinary files.
If the file filename is a symbolic link, the
file-symlink-p function returns its (non-recursive) link target
as a string. (The link target string is not necessarily the full
absolute file name of the target; determining the full file name that
the link points to is nontrivial, see below.) If the leading
directories of filename include symbolic links, this function
recursively follows them.
If the file filename is not a symbolic link, or does not exist,
file-symlink-p returns nil.
Here are a few examples of using this function:
(file-symlink-p "not-a-symlink")
⇒ nil
(file-symlink-p "sym-link")
⇒ "not-a-symlink"
(file-symlink-p "sym-link2")
⇒ "sym-link"
(file-symlink-p "/bin")
⇒ "/pub/bin"
Note that in the third example, the function returned sym-link, but did not proceed to resolve it, although that file is itself a symbolic link. This is what we meant by “non-recursive” above—the process of following the symbolic links does not recurse if the link target is itself a link.
The string that this function returns is what is recorded in the symbolic link; it may or may not include any leading directories. This function does not expand the link target to produce a fully-qualified file name, and in particular does not use the leading directories, if any, of the filename argument if the link target is not an absolute file name. Here’s an example:
(file-symlink-p "/foo/bar/baz")
⇒ "some-file"
Here, although /foo/bar/baz was given as a fully-qualified file
name, the result is not, and in fact does not have any leading
directories at all. And since some-file might itself be a
symbolic link, you cannot simply prepend leading directories to it,
nor even naively use expand-file-name (see section Functions that Expand Filenames) to produce its absolute file name.
For this reason, this function is seldom useful if you need to
determine more than just the fact that a file is or isn’t a symbolic
link. If you actually need the file name of the link target, use
file-chase-links or file-truename, described in
Truenames.
The next two functions recursively follow symbolic links at all levels for filename.
This function returns t if filename is the name of an
existing directory, nil otherwise.
(file-directory-p "~rms")
⇒ t
(file-directory-p "~rms/lewis/files.texi")
⇒ nil
(file-directory-p "~rms/lewis/no-such-file")
⇒ nil
(file-directory-p "$HOME")
⇒ nil
(file-directory-p
(substitute-in-file-name "$HOME"))
⇒ t
This function returns t if the file filename exists and is
a regular file (not a directory, named pipe, terminal, or
other I/O device).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The truename of a file is the name that you get by following symbolic links at all levels until none remain, then simplifying away ‘.’ and ‘..’ appearing as name components. This results in a sort of canonical name for the file. A file does not always have a unique truename; the number of distinct truenames a file has is equal to the number of hard links to the file. However, truenames are useful because they eliminate symbolic links as a cause of name variation.
This function returns the truename of the file filename. If the
argument is not an absolute file name, this function first expands it
against default-directory.
This function does not expand environment variables. Only
substitute-in-file-name does that. See Definition of substitute-in-file-name.
If you may need to follow symbolic links preceding ‘..’
appearing as a name component, call file-truename without prior
direct or indirect calls to expand-file-name. Otherwise, the
file name component immediately preceding ‘..’ will be
“simplified away” before file-truename is called. To
eliminate the need for a call to expand-file-name,
file-truename handles ‘~’ in the same way that
expand-file-name does. See section Functions
that Expand Filenames.
This function follows symbolic links, starting with filename, until it finds a file name which is not the name of a symbolic link. Then it returns that file name. This function does not follow symbolic links at the level of parent directories.
If you specify a number for limit, then after chasing through that many links, the function just returns what it has even if that is still a symbolic link.
To illustrate the difference between file-chase-links and
file-truename, suppose that /usr/foo is a symbolic link to
the directory /home/foo, and /home/foo/hello is an
ordinary file (or at least, not a symbolic link) or nonexistent. Then
we would have:
(file-chase-links "/usr/foo/hello")
;; This does not follow the links in the parent directories.
⇒ "/usr/foo/hello"
(file-truename "/usr/foo/hello")
;; Assuming that /home is not a symbolic link.
⇒ "/home/foo/hello"
This function returns t if the files file1 and
file2 name the same file. This is similar to comparing their
truenames, except that remote file names are also handled in an
appropriate manner. If file1 or file2 does not exist, the
return value is unspecified.
This function returns t if file is a file in directory
dir, or in a subdirectory of dir. It also returns
t if file and dir are the same directory. It
compares the truenames of the two directories. If dir does not
name an existing directory, the return value is nil.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes the functions for getting detailed information about a file, including the owner and group numbers, the number of names, the inode number, the size, and the times of access and modification.
This function returns t if the file filename1 is
newer than file filename2. If filename1 does not
exist, it returns nil. If filename1 does exist, but
filename2 does not, it returns t.
In the following example, assume that the file aug-19 was written on the 19th, aug-20 was written on the 20th, and the file no-file doesn’t exist at all.
(file-newer-than-file-p "aug-19" "aug-20")
⇒ nil
(file-newer-than-file-p "aug-20" "aug-19")
⇒ t
(file-newer-than-file-p "aug-19" "no-file")
⇒ t
(file-newer-than-file-p "no-file" "aug-19")
⇒ nil
If the filename argument to the next two functions is a symbolic link, then these function do not replace it with its target. However, they both recursively follow symbolic links at all levels of parent directories.
This function returns a list of attributes of file filename. If
the specified file cannot be opened, it returns nil.
The optional parameter id-format specifies the preferred format
of attributes UID and GID (see below)—the
valid values are 'string and 'integer. The latter is
the default, but we plan to change that, so you should specify a
non-nil value for id-format if you use the returned
UID or GID.
The elements of the list, in order, are:
t for a directory, a string for a symbolic link (the name
linked to), or nil for a text file.
add-name-to-file function
(see section Changing File Names and Attributes).
(sec-high
sec-low microsec picosec). (This is similar to the
value of current-time; see Time of Day.) Note that on
some FAT-based filesystems, only the date of last access is recorded,
so this time will always hold the midnight of the day of last access.
(high . low), where low holds the low 16
bits. If the inode number is too wide for even that, the value is of the form
(high middle . low), where high holds
the high bits, middle the middle 24 bits, and low the low
16 bits.
For example, here are the file attributes for files.texi:
(file-attributes "files.texi" 'string)
⇒ (nil 1 "lh" "users"
(20614 64019 50040 152000)
(20000 23 0 0)
(20614 64555 902289 872000)
122295 "-rw-rw-rw-"
t (5888 2 . 43978)
(15479 . 46724))
and here is how the result is interpreted:
nilis neither a directory nor a symbolic link.
1has only one name (the name files.texi in the current default directory).
"lh"is owned by the user with name "lh".
"users"is in the group with name "users".
(20614 64019 50040 152000)was last accessed on October 23, 2012, at 20:12:03.050040152 UTC.
(20000 23 0 0)was last modified on July 15, 2001, at 08:53:43 UTC.
(20614 64555 902289 872000)last had its status changed on October 23, 2012, at 20:20:59.902289872 UTC.
122295is 122295 bytes long. (It may not contain 122295 characters, though, if some of the bytes belong to multibyte sequences, and also if the end-of-line format is CR-LF.)
"-rw-rw-rw-"has a mode of read and write access for the owner, group, and world.
tis merely a placeholder; it carries no information.
(5888 2 . 43978)has an inode number of 6473924464520138.
(15479 . 46724)is on the file-system device whose number is 1014478468.
This function returns the number of names (i.e., hard links) that
file filename has. If the file does not exist, this function
returns nil. Note that symbolic links have no effect on this
function, because they are not considered to be names of the files
they link to.
$ ls -l foo* -rw-rw-rw- 2 rms rms 4 Aug 19 01:27 foo -rw-rw-rw- 2 rms rms 4 Aug 19 01:27 foo1
(file-nlinks "foo")
⇒ 2
(file-nlinks "doesnt-exist")
⇒ nil
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
On some operating systems, each file can be associated with arbitrary extended file attributes. At present, Emacs supports querying and setting two specific sets of extended file attributes: Access Control Lists (ACLs) and SELinux contexts. These extended file attributes are used, on some systems, to impose more sophisticated file access controls than the basic “Unix-style” permissions discussed in the previous sections.
A detailed explanation of ACLs and SELinux is beyond the scope of this manual. For our purposes, each file can be associated with an ACL, which specifies its properties under an ACL-based file control system, and/or an SELinux context, which specifies its properties under the SELinux system.
This function returns the ACL for the file filename. The exact
Lisp representation of the ACL is unspecified (and may change in
future Emacs versions), but it is the same as what set-file-acl
takes for its acl argument (see section Changing File Names and Attributes).
The underlying ACL implementation is platform-specific; on GNU/Linux and BSD, Emacs uses the POSIX ACL interface, while on MS-Windows Emacs emulates the POSIX ACL interface with native file security APIs.
If Emacs was not compiled with ACL support, or the file does not exist
or is inaccessible, or Emacs was unable to determine the ACL entries
for any other reason, then the return value is nil.
This function returns the SELinux context of the file filename,
as a list of the form (user role type
range). The list elements are the context’s user, role, type,
and range respectively, as Lisp strings; see the SELinux documentation
for details about what these actually mean. The return value has the
same form as what set-file-selinux-context takes for its
context argument (see section Changing File Names and Attributes).
If Emacs was not compiled with SELinux support, or the file does not
exist or is inaccessible, or if the system does not support SELinux,
then the return value is (nil nil nil nil).
This function returns an alist of the Emacs-recognized extended
attributes of file filename. Currently, it serves as a
convenient way to retrieve both the ACL and SELinux context; you can
then call the function set-file-extended-attributes, with the
returned alist as its second argument, to apply the same file access
attributes to another file (see section Changing File Names and Attributes).
One of the elements is (acl . acl), where acl has
the same form returned by file-acl.
Another element is (selinux-context . context), where
context is the SELinux context, in the same form returned by
file-selinux-context.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section explains how to search for a file in a list of directories (a path), or for an executable file in the standard list of executable file directories.
To search for a user-specific configuration file, See section Standard File Names, for the locate-user-emacs-file function.
This function searches for a file whose name is filename in a
list of directories given by path, trying the suffixes in
suffixes. If it finds such a file, it returns the file’s
absolute file name (see section Absolute and Relative File Names); otherwise it returns
nil.
The optional argument suffixes gives the list of file-name
suffixes to append to filename when searching.
locate-file tries each possible directory with each of these
suffixes. If suffixes is nil, or (""), then there
are no suffixes, and filename is used only as-is. Typical
values of suffixes are exec-suffixes (see section Functions that Create Subprocesses), load-suffixes, load-file-rep-suffixes and
the return value of the function get-load-suffixes (see section Load Suffixes).
Typical values for path are exec-path (see section Functions that Create Subprocesses) when looking for executable programs, or load-path
(see section Library Search) when looking for Lisp files. If
filename is absolute, path has no effect, but the suffixes
in suffixes are still tried.
The optional argument predicate, if non-nil, specifies a
predicate function for testing whether a candidate file is suitable.
The predicate is passed the candidate file name as its single
argument. If predicate is nil or omitted,
locate-file uses file-readable-p as the predicate.
See section Distinguishing Kinds of Files, for other useful predicates, e.g.,
file-executable-p and file-directory-p.
For compatibility, predicate can also be one of the symbols
executable, readable, writable, exists, or
a list of one or more of these symbols.
This function searches for the executable file of the named
program and returns the absolute file name of the executable,
including its file-name extensions, if any. It returns nil if
the file is not found. The functions searches in all the directories
in exec-path, and tries all the file-name extensions in
exec-suffixes (see section Functions that Create Subprocesses).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The functions in this section rename, copy, delete, link, and set the modes (permissions) of files.
In the functions that have an argument newname, if a file by the name of newname already exists, the actions taken depend on the value of the argument ok-if-already-exists:
file-already-exists error if
ok-if-already-exists is nil.
The next four commands all recursively follow symbolic links at all
levels of parent directories for their first argument, but, if that
argument is itself a symbolic link, then only copy-file
replaces it with its (recursive) target.
This function gives the file named oldname the additional name newname. This means that newname becomes a new “hard link” to oldname.
In the first part of the following example, we list two files, foo and foo3.
$ ls -li fo* 81908 -rw-rw-rw- 1 rms rms 29 Aug 18 20:32 foo 84302 -rw-rw-rw- 1 rms rms 24 Aug 18 20:31 foo3
Now we create a hard link, by calling add-name-to-file, then list
the files again. This shows two names for one file, foo and
foo2.
(add-name-to-file "foo" "foo2")
⇒ nil
$ ls -li fo* 81908 -rw-rw-rw- 2 rms rms 29 Aug 18 20:32 foo 81908 -rw-rw-rw- 2 rms rms 29 Aug 18 20:32 foo2 84302 -rw-rw-rw- 1 rms rms 24 Aug 18 20:31 foo3
Finally, we evaluate the following:
(add-name-to-file "foo" "foo3" t)
and list the files again. Now there are three names for one file: foo, foo2, and foo3. The old contents of foo3 are lost.
(add-name-to-file "foo1" "foo3")
⇒ nil
$ ls -li fo* 81908 -rw-rw-rw- 3 rms rms 29 Aug 18 20:32 foo 81908 -rw-rw-rw- 3 rms rms 29 Aug 18 20:32 foo2 81908 -rw-rw-rw- 3 rms rms 29 Aug 18 20:32 foo3
This function is meaningless on operating systems where multiple names for one file are not allowed. Some systems implement multiple names by copying the file instead.
See also file-nlinks in File Attributes.
This command renames the file filename as newname.
If filename has additional names aside from filename, it
continues to have those names. In fact, adding the name newname
with add-name-to-file and then deleting filename has the
same effect as renaming, aside from momentary intermediate states.
This command copies the file oldname to newname. An error is signaled if oldname does not exist. If newname names a directory, it copies oldname into that directory, preserving its final name component.
If time is non-nil, then this function gives the new file
the same last-modified time that the old one has. (This works on only
some operating systems.) If setting the time gets an error,
copy-file signals a file-date-error error. In an
interactive call, a prefix argument specifies a non-nil value
for time.
If argument preserve-uid-gid is nil, we let the operating
system decide the user and group ownership of the new file (this is
usually set to the user running Emacs). If preserve-uid-gid is
non-nil, we attempt to copy the user and group ownership of the
file. This works only on some operating systems, and only if you have
the correct permissions to do so.
If the optional argument preserve-permissions is non-nil,
this function copies the file modes (or “permissions”) of
oldname to newname, as well as the Access Control List and
SELinux context (if any). See section Information about Files.
Otherwise, the file modes of newname are left unchanged if it is
an existing file, and set to those of oldname, masked by the
default file permissions (see set-default-file-modes below), if
newname is to be newly created. The Access Control List or
SELinux context are not copied over in either case.
This command makes a symbolic link to filename, named newname. This is like the shell command ‘ln -s filename newname’.
This function is not available on systems that don’t support symbolic links.
This command deletes the file filename. If the file has
multiple names, it continues to exist under the other names. If
filename is a symbolic link, delete-file deletes only the
symbolic link and not its target (though it does follow symbolic links
at all levels of parent directories).
A suitable kind of file-error error is signaled if the file
does not exist, or is not deletable. (On Unix and GNU/Linux, a file
is deletable if its directory is writable.)
If the optional argument trash is non-nil and the
variable delete-by-moving-to-trash is non-nil, this
command moves the file into the system Trash instead of deleting it.
See Miscellaneous File Operations in The GNU
Emacs Manual. When called interactively, trash is t if
no prefix argument is given, and nil otherwise.
See also delete-directory in Creating, Copying and Deleting Directories.
This function sets the file mode (or permissions) of filename to mode. It recursively follows symbolic links at all levels for filename.
If called non-interactively, mode must be an integer. Only the lowest 12 bits of the integer are used; on most systems, only the lowest 9 bits are meaningful. You can use the Lisp construct for octal numbers to enter mode. For example,
(set-file-modes #o644)
specifies that the file should be readable and writable for its owner,
readable for group members, and readable for all other users.
See File permissions in The GNU Coreutils
Manual, for a description of mode bit specifications.
Interactively, mode is read from the minibuffer using
read-file-modes (see below), which lets the user type in either
an integer or a string representing the permissions symbolically.
See section File Attributes, for the function file-modes, which
returns the permissions of a file.
This function sets the default permissions for new files created by
Emacs and its subprocesses. Every file created with Emacs initially
has these permissions, or a subset of them (write-region will
not grant execute permissions even if the default file permissions
allow execution). On Unix and GNU/Linux, the default permissions are
given by the bitwise complement of the “umask” value.
The argument mode should be an integer which specifies the
permissions, similar to set-file-modes above. Only the lowest
9 bits are meaningful.
The default file permissions have no effect when you save a modified version of an existing file; saving a file preserves its existing permissions.
This function returns the default file permissions, as an integer.
This function reads a set of file mode bits from the minibuffer. The first optional argument prompt specifies a non-default prompt. Second second optional argument base-file is the name of a file on whose permissions to base the mode bits that this function returns, if what the user types specifies mode bits relative to permissions of an existing file.
If user input represents an octal number, this function returns that
number. If it is a complete symbolic specification of mode bits, as
in "u=rwx", the function converts it to the equivalent numeric
value using file-modes-symbolic-to-number and returns the
result. If the specification is relative, as in "o+g", then
the permissions on which the specification is based are taken from the
mode bits of base-file. If base-file is omitted or
nil, the function uses 0 as the base mode bits. The
complete and relative specifications can be combined, as in
"u+r,g+rx,o+r,g-w". See File permissions in The
GNU Coreutils Manual, for a description of file mode
specifications.
This function converts a symbolic file mode specification in
modes into the equivalent integer. If the symbolic
specification is based on an existing file, that file’s mode bits are
taken from the optional argument base-modes; if that argument is
omitted or nil, it defaults to 0, i.e., no access rights at
all.
This function sets the access and modification times of filename
to time. The return value is t if the times are successfully
set, otherwise it is nil. time defaults to the current
time and must be in the format returned by current-time
(see section Time of Day).
This function sets the Emacs-recognized extended file attributes for
filename. The second argument attribute-alist should be
an alist of the same form returned by file-extended-attributes.
See section Extended File Attributes.
This function sets the SELinux security context for filename to
context. The context argument should be a list
(user role type range), where each
element is a string. See section Extended File Attributes.
The function returns t if it succeeds in setting the SELinux
context of filename. It returns nil if the context was
not set (e.g., if SELinux is disabled, or if Emacs was compiled
without SELinux support).
This function sets the Access Control List for filename to
acl. The acl argument should have the same form returned
by the function file-acl. See section Extended File Attributes.
The function returns t if it successfully sets the ACL of
filename, nil otherwise.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Files are generally referred to by their names, in Emacs as elsewhere. File names in Emacs are represented as strings. The functions that operate on a file all expect a file name argument.
In addition to operating on files themselves, Emacs Lisp programs often need to operate on file names; i.e., to take them apart and to use part of a name to construct related file names. This section describes how to manipulate file names.
The functions in this section do not actually access files, so they can operate on file names that do not refer to an existing file or directory.
On MS-DOS and MS-Windows, these functions (like the function that actually operate on files) accept MS-DOS or MS-Windows file-name syntax, where backslashes separate the components, as well as Unix syntax; but they always return Unix syntax. This enables Lisp programs to specify file names in Unix syntax and work properly on all systems without change.13
| 24.8.1 File Name Components | The directory part of a file name, and the rest. | |
| 24.8.2 Absolute and Relative File Names | Some file names are relative to a current directory. | |
| 24.8.3 Directory Names | A directory’s name as a directory is different from its name as a file. | |
| 24.8.4 Functions that Expand Filenames | Converting relative file names to absolute ones. | |
| 24.8.5 Generating Unique File Names | Generating names for temporary files. | |
| 24.8.6 File Name Completion | Finding the completions for a given file name. | |
| 24.8.7 Standard File Names | If your package uses a fixed file name, how to handle various operating systems simply. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The operating system groups files into directories. To specify a file, you must specify the directory and the file’s name within that directory. Therefore, Emacs considers a file name as having two main parts: the directory name part, and the nondirectory part (or file name within the directory). Either part may be empty. Concatenating these two parts reproduces the original file name.
On most systems, the directory part is everything up to and including the last slash (backslash is also allowed in input on MS-DOS or MS-Windows); the nondirectory part is the rest.
For some purposes, the nondirectory part is further subdivided into the name proper and the version number. On most systems, only backup files have version numbers in their names.
This function returns the directory part of filename, as a
directory name (see section Directory Names), or nil if
filename does not include a directory part.
On GNU and Unix systems, a string returned by this function always ends in a slash. On MS-DOS it can also end in a colon.
(file-name-directory "lewis/foo") ; Unix example
⇒ "lewis/"
(file-name-directory "foo") ; Unix example
⇒ nil
This function returns the nondirectory part of filename.
(file-name-nondirectory "lewis/foo")
⇒ "foo"
(file-name-nondirectory "foo")
⇒ "foo"
(file-name-nondirectory "lewis/")
⇒ ""
This function returns filename with any file version numbers, backup version numbers, or trailing tildes discarded.
If keep-backup-version is non-nil, then true file version
numbers understood as such by the file system are discarded from the
return value, but backup version numbers are kept.
(file-name-sans-versions "~rms/foo.~1~")
⇒ "~rms/foo"
(file-name-sans-versions "~rms/foo~")
⇒ "~rms/foo"
(file-name-sans-versions "~rms/foo")
⇒ "~rms/foo"
This function returns filename’s final “extension”, if any,
after applying file-name-sans-versions to remove any
version/backup part. The extension, in a file name, is the part that
follows the last ‘.’ in the last name component (minus any
version/backup part).
This function returns nil for extensionless file names such as
foo. It returns "" for null extensions, as in
foo.. If the last component of a file name begins with a
‘.’, that ‘.’ doesn’t count as the beginning of an
extension. Thus, .emacs’s “extension” is nil, not
‘.emacs’.
If period is non-nil, then the returned value includes
the period that delimits the extension, and if filename has no
extension, the value is "".
This function returns filename minus its extension, if any. The version/backup part, if present, is only removed if the file has an extension. For example,
(file-name-sans-extension "foo.lose.c")
⇒ "foo.lose"
(file-name-sans-extension "big.hack/foo")
⇒ "big.hack/foo"
(file-name-sans-extension "/my/home/.emacs")
⇒ "/my/home/.emacs"
(file-name-sans-extension "/my/home/.emacs.el")
⇒ "/my/home/.emacs"
(file-name-sans-extension "~/foo.el.~3~")
⇒ "~/foo"
(file-name-sans-extension "~/foo.~3~")
⇒ "~/foo.~3~"
Note that the ‘.~3~’ in the two last examples is the backup part, not an extension.
This function is the composition of file-name-sans-extension
and file-name-nondirectory. For example,
(file-name-base "/my/home/foo.c")
⇒ "foo"
The filename argument defaults to buffer-file-name.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
All the directories in the file system form a tree starting at the root directory. A file name can specify all the directory names starting from the root of the tree; then it is called an absolute file name. Or it can specify the position of the file in the tree relative to a default directory; then it is called a relative file name. On Unix and GNU/Linux, an absolute file name starts with a ‘/’ or a ‘~’ (see abbreviate-file-name), and a relative one does not. On MS-DOS and MS-Windows, an absolute file name starts with a slash or a backslash, or with a drive specification ‘x:/’, where x is the drive letter.
This function returns t if file filename is an absolute
file name, nil otherwise.
(file-name-absolute-p "~rms/foo")
⇒ t
(file-name-absolute-p "rms/foo")
⇒ nil
(file-name-absolute-p "/user/rms/foo")
⇒ t
Given a possibly relative file name, you can convert it to an
absolute name using expand-file-name (see section Functions that Expand Filenames). This function converts absolute file names to relative
names:
This function tries to return a relative name that is equivalent to
filename, assuming the result will be interpreted relative to
directory (an absolute directory name or directory file name).
If directory is omitted or nil, it defaults to the
current buffer’s default directory.
On some operating systems, an absolute file name begins with a device
name. On such systems, filename has no relative equivalent based
on directory if they start with two different device names. In
this case, file-relative-name returns filename in absolute
form.
(file-relative-name "/foo/bar" "/foo/")
⇒ "bar"
(file-relative-name "/foo/bar" "/hack/")
⇒ "../foo/bar"
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A directory name is the name of a directory. A directory is actually a kind of file, so it has a file name, which is related to the directory name but not identical to it. (This is not quite the same as the usual Unix terminology.) These two different names for the same entity are related by a syntactic transformation. On GNU and Unix systems, this is simple: a directory name ends in a slash, whereas the directory’s name as a file lacks that slash. On MS-DOS the relationship is more complicated.
The difference between a directory name and its name as a file is
subtle but crucial. When an Emacs variable or function argument is
described as being a directory name, a file name of a directory is not
acceptable. When file-name-directory returns a string, that is
always a directory name.
The following two functions convert between directory names and file names. They do nothing special with environment variable substitutions such as ‘$HOME’, and the constructs ‘~’, ‘.’ and ‘..’.
This function returns a string representing filename in a form that the operating system will interpret as the name of a directory. On most systems, this means appending a slash to the string (if it does not already end in one).
(file-name-as-directory "~rms/lewis")
⇒ "~rms/lewis/"
This function returns a string representing dirname in a form that the operating system will interpret as the name of a file. On most systems, this means removing the final slash (or backslash) from the string.
(directory-file-name "~lewis/")
⇒ "~lewis"
Given a directory name, you can combine it with a relative file name
using concat:
(concat dirname relfile)
Be sure to verify that the file name is relative before doing that. If you use an absolute file name, the results could be syntactically invalid or refer to the wrong file.
If you want to use a directory file name in making such a
combination, you must first convert it to a directory name using
file-name-as-directory:
(concat (file-name-as-directory dirfile) relfile)
Don’t try concatenating a slash by hand, as in
;;; Wrong!
(concat dirfile "/" relfile)
because this is not portable. Always use
file-name-as-directory.
To convert a directory name to its abbreviation, use this function:
This function returns an abbreviated form of filename. It
applies the abbreviations specified in directory-abbrev-alist
(see File Aliases in The GNU Emacs Manual),
then substitutes ‘~’ for the user’s home directory if the
argument names a file in the home directory or one of its
subdirectories. If the home directory is a root directory, it is not
replaced with ‘~’, because this does not make the result shorter
on many systems.
You can use this function for directory names and for file names, because it recognizes abbreviations even as part of the name.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Expanding a file name means converting a relative file name to an absolute one. Since this is done relative to a default directory, you must specify the default directory name as well as the file name to be expanded. It also involves expanding abbreviations like ~/ (see abbreviate-file-name), and eliminating redundancies like ./ and name/../.
This function converts filename to an absolute file name. If
directory is supplied, it is the default directory to start with
if filename is relative. (The value of directory should
itself be an absolute directory name or directory file name; it may
start with ‘~’.) Otherwise, the current buffer’s value of
default-directory is used. For example:
(expand-file-name "foo")
⇒ "/xcssun/users/rms/lewis/foo"
(expand-file-name "../foo")
⇒ "/xcssun/users/rms/foo"
(expand-file-name "foo" "/usr/spool/")
⇒ "/usr/spool/foo"
If the part of the combined file name before the first slash is
‘~’, it expands to the value of the HOME environment
variable (usually your home directory). If the part before the first
slash is ‘~user’ and if user is a valid login name,
it expands to user’s home directory.
Filenames containing ‘.’ or ‘..’ are simplified to their canonical form:
(expand-file-name "bar/../foo")
⇒ "/xcssun/users/rms/lewis/foo"
In some cases, a leading ‘..’ component can remain in the output:
(expand-file-name "../home" "/")
⇒ "/../home"
This is for the sake of filesystems that have the concept of a “superroot” above the root directory /. On other filesystems, /../ is interpreted exactly the same as /.
Note that expand-file-name does not expand environment
variables; only substitute-in-file-name does that:
(expand-file-name "$HOME/foo")
⇒ "/xcssun/users/rms/lewis/$HOME/foo"
Note also that expand-file-name does not follow symbolic links
at any level. This results in a difference between the way
file-truename and expand-file-name treat ‘..’.
Assuming that ‘/tmp/bar’ is a symbolic link to the directory
‘/tmp/foo/bar’ we get:
(file-truename "/tmp/bar/../myfile")
⇒ "/tmp/foo/myfile"
(expand-file-name "/tmp/bar/../myfile")
⇒ "/tmp/myfile"
If you may need to follow symbolic links preceding ‘..’, you
should make sure to call file-truename without prior direct or
indirect calls to expand-file-name. See section Truenames.
The value of this buffer-local variable is the default directory for the current buffer. It should be an absolute directory name; it may start with ‘~’. This variable is buffer-local in every buffer.
expand-file-name uses the default directory when its second
argument is nil.
The value is always a string ending with a slash.
default-directory
⇒ "/user/lewis/manual/"
This function replaces environment variable references in filename with the environment variable values. Following standard Unix shell syntax, ‘$’ is the prefix to substitute an environment variable value. If the input contains ‘$$’, that is converted to ‘$’; this gives the user a way to “quote” a ‘$’.
The environment variable name is the series of alphanumeric characters (including underscores) that follow the ‘$’. If the character following the ‘$’ is a ‘{’, then the variable name is everything up to the matching ‘}’.
Calling substitute-in-file-name on output produced by
substitute-in-file-name tends to give incorrect results. For
instance, use of ‘$$’ to quote a single ‘$’ won’t work
properly, and ‘$’ in an environment variable’s value could lead
to repeated substitution. Therefore, programs that call this function
and put the output where it will be passed to this function need to
double all ‘$’ characters to prevent subsequent incorrect
results.
Here we assume that the environment variable HOME, which holds
the user’s home directory name, has value ‘/xcssun/users/rms’.
(substitute-in-file-name "$HOME/foo")
⇒ "/xcssun/users/rms/foo"
After substitution, if a ‘~’ or a ‘/’ appears immediately after another ‘/’, the function discards everything before it (up through the immediately preceding ‘/’).
(substitute-in-file-name "bar/~/foo")
⇒ "~/foo"
(substitute-in-file-name "/usr/local/$HOME/foo")
⇒ "/xcssun/users/rms/foo"
;; /usr/local/ has been discarded.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Some programs need to write temporary files. Here is the usual way to construct a name for such a file:
(make-temp-file name-of-application)
The job of make-temp-file is to prevent two different users or
two different jobs from trying to use the exact same file name.
This function creates a temporary file and returns its name. Emacs
creates the temporary file’s name by adding to prefix some
random characters that are different in each Emacs job. The result is
guaranteed to be a newly created empty file. On MS-DOS, this function
can truncate the string prefix to fit into the 8+3 file-name
limits. If prefix is a relative file name, it is expanded
against temporary-file-directory.
(make-temp-file "foo")
⇒ "/tmp/foo232J6v"
When make-temp-file returns, the file has been created and is
empty. At that point, you should write the intended contents into the
file.
If dir-flag is non-nil, make-temp-file creates an
empty directory instead of an empty file. It returns the file name,
not the directory name, of that directory. See section Directory Names.
If suffix is non-nil, make-temp-file adds it at
the end of the file name.
To prevent conflicts among different libraries running in the same
Emacs, each Lisp program that uses make-temp-file should have its
own prefix. The number added to the end of prefix
distinguishes between the same application running in different Emacs
jobs. Additional added characters permit a large number of distinct
names even in one Emacs job.
The default directory for temporary files is controlled by the
variable temporary-file-directory. This variable gives the user
a uniform way to specify the directory for all temporary files. Some
programs use small-temporary-file-directory instead, if that is
non-nil. To use it, you should expand the prefix against
the proper directory before calling make-temp-file.
This variable specifies the directory name for creating temporary files.
Its value should be a directory name (see section Directory Names), but it
is good for Lisp programs to cope if the value is a directory’s file
name instead. Using the value as the second argument to
expand-file-name is a good way to achieve that.
The default value is determined in a reasonable way for your operating
system; it is based on the TMPDIR, TMP and TEMP
environment variables, with a fall-back to a system-dependent name if
none of these variables is defined.
Even if you do not use make-temp-file to create the temporary
file, you should still use this variable to decide which directory to
put the file in. However, if you expect the file to be small, you
should use small-temporary-file-directory first if that is
non-nil.
This variable specifies the directory name for creating certain temporary files, which are likely to be small.
If you want to write a temporary file which is likely to be small, you should compute the directory like this:
(make-temp-file
(expand-file-name prefix
(or small-temporary-file-directory
temporary-file-directory)))
This function generates a string that can be used as a unique file
name. The name starts with base-name, and has several random
characters appended to it, which are different in each Emacs job. It
is like make-temp-file except that (i) it just constructs a
name, and does not create a file, and (ii) base-name should be
an absolute file name (on MS-DOS, this function can truncate
base-name to fit into the 8+3 file-name limits).
Warning: In most cases, you should not use this function; use
make-temp-file instead! This function is susceptible to a race
condition, between the make-temp-name call and the creation of
the file, which in some cases may cause a security hole.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes low-level subroutines for completing a file name. For higher level functions, see Reading File Names.
This function returns a list of all possible completions for a file whose name starts with partial-filename in directory directory. The order of the completions is the order of the files in the directory, which is unpredictable and conveys no useful information.
The argument partial-filename must be a file name containing no directory part and no slash (or backslash on some systems). The current buffer’s default directory is prepended to directory, if directory is not absolute.
In the following example, suppose that ~rms/lewis is the current default directory, and has five files whose names begin with ‘f’: foo, file~, file.c, file.c.~1~, and file.c.~2~.
(file-name-all-completions "f" "")
⇒ ("foo" "file~" "file.c.~2~"
"file.c.~1~" "file.c")
(file-name-all-completions "fo" "")
⇒ ("foo")
This function completes the file name filename in directory
directory. It returns the longest prefix common to all file names
in directory directory that start with filename. If
predicate is non-nil then it ignores possible completions
that don’t satisfy predicate, after calling that function
with one argument, the expanded absolute file name.
If only one match exists and filename matches it exactly, the
function returns t. The function returns nil if directory
directory contains no name starting with filename.
In the following example, suppose that the current default directory has five files whose names begin with ‘f’: foo, file~, file.c, file.c.~1~, and file.c.~2~.
(file-name-completion "fi" "")
⇒ "file"
(file-name-completion "file.c.~1" "")
⇒ "file.c.~1~"
(file-name-completion "file.c.~1~" "")
⇒ t
(file-name-completion "file.c.~3" "")
⇒ nil
file-name-completion usually ignores file names that end in any
string in this list. It does not ignore them when all the possible
completions end in one of these suffixes. This variable has no effect
on file-name-all-completions.
A typical value might look like this:
completion-ignored-extensions
⇒ (".o" ".elc" "~" ".dvi")
If an element of completion-ignored-extensions ends in a slash
‘/’, it signals a directory. The elements which do not end
in a slash will never match a directory; thus, the above value will not
filter out a directory named foo.elc.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Sometimes, an Emacs Lisp program needs to specify a standard file
name for a particular use—typically, to hold configuration data
specified by the current user. Usually, such files should be located
in the directory specified by user-emacs-directory, which is
~/.emacs.d by default (see section The Init File). For example, abbrev
definitions are stored by default in ~/.emacs.d/abbrev_defs.
The easiest way to specify such a file name is to use the function
locate-user-emacs-file.
This function returns an absolute file name for an Emacs-specific
configuration or data file. The argument base-name should be a
relative file name. The return value is the absolute name of a file
in the directory specified by user-emacs-directory; if that
directory does not exist, this function creates it.
If the optional argument old-name is non-nil, it
specifies a file in the user’s home directory,
~/old-name. If such a file exists, the return value is
the absolute name of that file, instead of the file specified by
base-name. This argument is intended to be used by Emacs
packages to provide backward compatibility. For instance, prior to
the introduction of user-emacs-directory, the abbrev file was
located in ~/.abbrev_defs. Here is the definition of
abbrev-file-name:
(defcustom abbrev-file-name (locate-user-emacs-file "abbrev_defs" ".abbrev_defs") "Default name of file from which to read abbrevs." … :type 'file)
A lower-level function for standardizing file names, which
locate-user-emacs-file uses as a subroutine, is
convert-standard-filename.
This function returns a file name based on filename, which fits the conventions of the current operating system.
On GNU and Unix systems, this simply returns filename. On other operating systems, it may enforce system-specific file name conventions; for example, on MS-DOS this function performs a variety of changes to enforce MS-DOS file name limitations, including converting any leading ‘.’ to ‘_’ and truncating to three characters after the ‘.’.
The recommended way to use this function is to specify a name which
fits the conventions of GNU and Unix systems, and pass it to
convert-standard-filename.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A directory is a kind of file that contains other files entered under various names. Directories are a feature of the file system.
Emacs can list the names of the files in a directory as a Lisp list,
or display the names in a buffer using the ls shell command. In
the latter case, it can optionally display information about each file,
depending on the options passed to the ls command.
This function returns a list of the names of the files in the directory directory. By default, the list is in alphabetical order.
If full-name is non-nil, the function returns the files’
absolute file names. Otherwise, it returns the names relative to
the specified directory.
If match-regexp is non-nil, this function returns only
those file names that contain a match for that regular expression—the
other file names are excluded from the list. On case-insensitive
filesystems, the regular expression matching is case-insensitive.
If nosort is non-nil, directory-files does not sort
the list, so you get the file names in no particular order. Use this if
you want the utmost possible speed and don’t care what order the files
are processed in. If the order of processing is visible to the user,
then the user will probably be happier if you do sort the names.
(directory-files "~lewis")
⇒ ("#foo#" "#foo.el#" "." ".."
"dired-mods.el" "files.texi"
"files.texi.~1~")
An error is signaled if directory is not the name of a directory that can be read.
This is similar to directory-files in deciding which files
to report on and how to report their names. However, instead
of returning a list of file names, it returns for each file a
list (filename . attributes), where attributes
is what file-attributes would return for that file.
The optional argument id-format has the same meaning as the
corresponding argument to file-attributes (see Definition of file-attributes).
This function expands the wildcard pattern pattern, returning a list of file names that match it.
If pattern is written as an absolute file name, the values are absolute also.
If pattern is written as a relative file name, it is interpreted
relative to the current default directory. The file names returned are
normally also relative to the current default directory. However, if
full is non-nil, they are absolute.
This function inserts (in the current buffer) a directory listing for
directory file, formatted with ls according to
switches. It leaves point after the inserted text.
switches may be a string of options, or a list of strings
representing individual options.
The argument file may be either a directory name or a file
specification including wildcard characters. If wildcard is
non-nil, that means treat file as a file specification with
wildcards.
If full-directory-p is non-nil, that means the directory
listing is expected to show the full contents of a directory. You
should specify t when file is a directory and switches do
not contain ‘-d’. (The ‘-d’ option to ls says to
describe a directory itself as a file, rather than showing its
contents.)
On most systems, this function works by running a directory listing
program whose name is in the variable insert-directory-program.
If wildcard is non-nil, it also runs the shell specified by
shell-file-name, to expand the wildcards.
MS-DOS and MS-Windows systems usually lack the standard Unix program
ls, so this function emulates the standard Unix program ls
with Lisp code.
As a technical detail, when switches contains the long
‘--dired’ option, insert-directory treats it specially,
for the sake of dired. However, the normally equivalent short
‘-D’ option is just passed on to insert-directory-program,
as any other option.
This variable’s value is the program to run to generate a directory listing
for the function insert-directory. It is ignored on systems
which generate the listing with Lisp code.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Most Emacs Lisp file-manipulation functions get errors when used on
files that are directories. For example, you cannot delete a directory
with delete-file. These special functions exist to create and
delete directories.
This command creates a directory named dirname. If
parents is non-nil, as is always the case in an
interactive call, that means to create the parent directories first,
if they don’t already exist.
mkdir is an alias for this.
This command copies the directory named dirname to newname. If newname names an existing directory, dirname will be copied to a subdirectory there.
It always sets the file modes of the copied files to match the corresponding original file.
The third argument keep-time non-nil means to preserve the
modification time of the copied files. A prefix arg makes
keep-time non-nil.
The fourth argument parents says whether to create parent directories if they don’t exist. Interactively, this happens by default.
The fifth argument copy-contents, if non-nil, means to
copy the contents of dirname directly into newname if the
latter is an existing directory, instead of copying dirname into
it as a subdirectory.
This command deletes the directory named dirname. The function
delete-file does not work for files that are directories; you
must use delete-directory for them. If recursive is
nil, and the directory contains any files,
delete-directory signals an error.
delete-directory only follows symbolic links at the level of
parent directories.
If the optional argument trash is non-nil and the
variable delete-by-moving-to-trash is non-nil, this
command moves the file into the system Trash instead of deleting it.
See Miscellaneous File Operations in The GNU
Emacs Manual. When called interactively, trash is t if
no prefix argument is given, and nil otherwise.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can implement special handling for certain file names. This is called making those names magic. The principal use for this feature is in implementing access to remote files (see Remote Files in The GNU Emacs Manual).
To define a kind of magic file name, you must supply a regular expression to define the class of names (all those that match the regular expression), plus a handler that implements all the primitive Emacs file operations for file names that match.
The variable file-name-handler-alist holds a list of handlers,
together with regular expressions that determine when to apply each
handler. Each element has this form:
(regexp . handler)
All the Emacs primitives for file access and file name transformation
check the given file name against file-name-handler-alist. If
the file name matches regexp, the primitives handle that file by
calling handler.
The first argument given to handler is the name of the primitive, as a symbol; the remaining arguments are the arguments that were passed to that primitive. (The first of these arguments is most often the file name itself.) For example, if you do this:
(file-exists-p filename)
and filename has handler handler, then handler is called like this:
(funcall handler 'file-exists-p filename)
When a function takes two or more arguments that must be file names, it checks each of those names for a handler. For example, if you do this:
(expand-file-name filename dirname)
then it checks for a handler for filename and then for a handler for dirname. In either case, the handler is called like this:
(funcall handler 'expand-file-name filename dirname)
The handler then needs to figure out whether to handle filename or dirname.
If the specified file name matches more than one handler, the one whose match starts last in the file name gets precedence. This rule is chosen so that handlers for jobs such as uncompression are handled first, before handlers for jobs such as remote file access.
Here are the operations that a magic file name handler gets to handle:
access-file, add-name-to-file,
byte-compiler-base-file-name,
copy-directory, copy-file,
delete-directory, delete-file,
diff-latest-backup-file,
directory-file-name,
directory-files,
directory-files-and-attributes,
dired-compress-file, dired-uncache,
expand-file-name,
file-accessible-directory-p,
file-acl,
file-attributes,
file-directory-p,
file-equal-p,
file-executable-p, file-exists-p,
file-in-directory-p,
file-local-copy,
file-modes, file-name-all-completions,
file-name-as-directory,
file-name-completion,
file-name-directory,
file-name-nondirectory,
file-name-sans-versions, file-newer-than-file-p,
file-notify-add-watch, file-notify-rm-watch,
file-ownership-preserved-p,
file-readable-p, file-regular-p,
file-remote-p, file-selinux-context,
file-symlink-p, file-truename, file-writable-p,
find-backup-file-name,
get-file-buffer,
insert-directory,
insert-file-contents,
load,
make-auto-save-file-name,
make-directory,
make-directory-internal,
make-symbolic-link,
process-file,
rename-file, set-file-acl, set-file-modes,
set-file-selinux-context, set-file-times,
set-visited-file-modtime, shell-command,
start-file-process,
substitute-in-file-name,
unhandled-file-name-directory,
vc-registered,
verify-visited-file-modtime,
write-region.
Handlers for insert-file-contents typically need to clear the
buffer’s modified flag, with (set-buffer-modified-p nil), if the
visit argument is non-nil. This also has the effect of
unlocking the buffer if it is locked.
The handler function must handle all of the above operations, and possibly others to be added in the future. It need not implement all these operations itself—when it has nothing special to do for a certain operation, it can reinvoke the primitive, to handle the operation “in the usual way”. It should always reinvoke the primitive for an operation it does not recognize. Here’s one way to do this:
(defun my-file-handler (operation &rest args) ;; First check for the specific operations ;; that we have special handling for. (cond ((eq operation 'insert-file-contents) …) ((eq operation 'write-region) …) … ;; Handle any operation we don’t know about. (t (let ((inhibit-file-name-handlers (cons 'my-file-handler (and (eq inhibit-file-name-operation operation) inhibit-file-name-handlers))) (inhibit-file-name-operation operation)) (apply operation args)))))
When a handler function decides to call the ordinary Emacs primitive for
the operation at hand, it needs to prevent the primitive from calling
the same handler once again, thus leading to an infinite recursion. The
example above shows how to do this, with the variables
inhibit-file-name-handlers and
inhibit-file-name-operation. Be careful to use them exactly as
shown above; the details are crucial for proper behavior in the case of
multiple handlers, and for operations that have two file names that may
each have handlers.
Handlers that don’t really do anything special for actual access to the
file—such as the ones that implement completion of host names for
remote file names—should have a non-nil safe-magic
property. For instance, Emacs normally “protects” directory names
it finds in PATH from becoming magic, if they look like magic
file names, by prefixing them with ‘/:’. But if the handler that
would be used for them has a non-nil safe-magic
property, the ‘/:’ is not added.
A file name handler can have an operations property to
declare which operations it handles in a nontrivial way. If this
property has a non-nil value, it should be a list of
operations; then only those operations will call the handler. This
avoids inefficiency, but its main purpose is for autoloaded handler
functions, so that they won’t be loaded except when they have real
work to do.
Simply deferring all operations to the usual primitives does not
work. For instance, if the file name handler applies to
file-exists-p, then it must handle load itself, because
the usual load code won’t work properly in that case. However,
if the handler uses the operations property to say it doesn’t
handle file-exists-p, then it need not handle load
nontrivially.
This variable holds a list of handlers whose use is presently inhibited for a certain operation.
The operation for which certain handlers are presently inhibited.
This function returns the handler function for file name file,
or nil if there is none. The argument operation should
be the operation to be performed on the file—the value you will pass
to the handler as its first argument when you call it. If
operation equals inhibit-file-name-operation, or if it is
not found in the operations property of the handler, this
function returns nil.
This function copies file filename to an ordinary non-magic file
on the local machine, if it isn’t on the local machine already. Magic
file names should handle the file-local-copy operation if they
refer to files on other machines. A magic file name that is used for
other purposes than remote file access should not handle
file-local-copy; then this function will treat the file as
local.
If filename is local, whether magic or not, this function does
nothing and returns nil. Otherwise it returns the file name
of the local copy file.
This function tests whether filename is a remote file. If
filename is local (not remote), the return value is nil.
If filename is indeed remote, the return value is a string that
identifies the remote system.
This identifier string can include a host name and a user name, as
well as characters designating the method used to access the remote
system. For example, the remote identifier string for the filename
/sudo::/some/file is /sudo:root@localhost:.
If file-remote-p returns the same identifier for two different
filenames, that means they are stored on the same file system and can
be accessed locally with respect to each other. This means, for
example, that it is possible to start a remote process accessing both
files at the same time. Implementers of file handlers need to ensure
this principle is valid.
identification specifies which part of the identifier shall be
returned as string. identification can be the symbol
method, user or host; any other value is handled
like nil and means to return the complete identifier string.
In the example above, the remote user identifier string would
be root.
If connected is non-nil, this function returns nil
even if filename is remote, if Emacs has no network connection
to its host. This is useful when you want to avoid the delay of
making connections when they don’t exist.
This function returns the name of a directory that is not magic. It
uses the directory part of filename if that is not magic. For a
magic file name, it invokes the file name handler, which therefore
decides what value to return. If filename is not accessible
from a local process, then the file name handler should indicate it by
returning nil.
This is useful for running a subprocess; every subprocess must have a non-magic directory to serve as its current directory, and this function is a good way to come up with one.
The attributes of remote files can be cached for better performance. If they are changed outside of Emacs’s control, the cached values become invalid, and must be reread.
When this variable is set to nil, cached values are never
expired. Use this setting with caution, only if you are sure nothing
other than Emacs ever changes the remote files. If it is set to
t, cached values are never used. This is the safest value, but
could result in performance degradation.
A compromise is to set it to a positive number. This means that cached values are used for that amount of seconds since they were cached. If a remote file is checked regularly, it might be a good idea to let-bind this variable to a value less than the time period between consecutive checks. For example:
(defun display-time-file-nonempty-p (file)
(let ((remote-file-name-inhibit-cache
(- display-time-interval 5)))
(and (file-exists-p file)
(< 0 (nth 7 (file-attributes
(file-chase-links file)))))))
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs performs several steps to convert the data in a buffer (text,
text properties, and possibly other information) to and from a
representation suitable for storing into a file. This section describes
the fundamental functions that perform this format conversion,
namely insert-file-contents for reading a file into a buffer,
and write-region for writing a buffer into a file.
| 24.12.1 Overview | insert-file-contents and write-region.
| |
| 24.12.2 Round-Trip Specification | Using format-alist.
| |
| 24.12.3 Piecemeal Specification | Specifying non-paired conversion. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The function insert-file-contents:
format-alist; and
after-insert-file-functions.
The function write-region:
write-region-annotate-functions;
format-alist;
This shows the symmetry of the lowest-level operations; reading and writing handle things in opposite order. The rest of this section describes the two facilities surrounding the three variables named above, as well as some related functions. Coding Systems, for details on character encoding and decoding.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The most general of the two facilities is controlled by the variable
format-alist, a list of file format specifications, which
describe textual representations used in files for the data in an Emacs
buffer. The descriptions for reading and writing are paired, which is
why we call this “round-trip” specification
(see section Piecemeal Specification, for non-paired specification).
This list contains one format definition for each defined file format. Each format definition is a list of this form:
(name doc-string regexp from-fn to-fn modify mode-fn preserve)
Here is what the elements in a format definition mean:
The name of this format.
A documentation string for the format.
A regular expression which is used to recognize files represented in
this format. If nil, the format is never applied automatically.
A shell command or function to decode data in this format (to convert file data into the usual Emacs data representation).
A shell command is represented as a string; Emacs runs the command as a filter to perform the conversion.
If from-fn is a function, it is called with two arguments, begin and end, which specify the part of the buffer it should convert. It should convert the text by editing it in place. Since this can change the length of the text, from-fn should return the modified end position.
One responsibility of from-fn is to make sure that the beginning of the file no longer matches regexp. Otherwise it is likely to get called again.
A shell command or function to encode data in this format—that is, to convert the usual Emacs data representation into this format.
If to-fn is a string, it is a shell command; Emacs runs the command as a filter to perform the conversion.
If to-fn is a function, it is called with three arguments: begin and end, which specify the part of the buffer it should convert, and buffer, which specifies which buffer. There are two ways it can do the conversion:
(position . string), where position is an
integer specifying the relative position in the text to be written, and
string is the annotation to add there. The list must be sorted in
order of position when to-fn returns it.
When write-region actually writes the text from the buffer to the
file, it intermixes the specified annotations at the corresponding
positions. All this takes place without modifying the buffer.
A flag, t if the encoding function modifies the buffer, and
nil if it works by returning a list of annotations.
A minor-mode function to call after visiting a file converted from this format. The function is called with one argument, the integer 1; that tells a minor-mode function to enable the mode.
A flag, t if format-write-file should not remove this format
from buffer-file-format.
The function insert-file-contents automatically recognizes file
formats when it reads the specified file. It checks the text of the
beginning of the file against the regular expressions of the format
definitions, and if it finds a match, it calls the decoding function for
that format. Then it checks all the known formats over again.
It keeps checking them until none of them is applicable.
Visiting a file, with find-file-noselect or the commands that use
it, performs conversion likewise (because it calls
insert-file-contents); it also calls the mode function for each
format that it decodes. It stores a list of the format names in the
buffer-local variable buffer-file-format.
This variable states the format of the visited file. More precisely, this is a list of the file format names that were decoded in the course of visiting the current buffer’s file. It is always buffer-local in all buffers.
When write-region writes data into a file, it first calls the
encoding functions for the formats listed in buffer-file-format,
in the order of appearance in the list.
This command writes the current buffer contents into the file file
in a format based on format, which is a list of format names. It
constructs the actual format starting from format, then appending
any elements from the value of buffer-file-format with a
non-nil preserve flag (see above), if they are not already
present in format. It then updates buffer-file-format with
this format, making it the default for future saves. Except for the
format argument, this command is similar to write-file. In
particular, confirm has the same meaning and interactive treatment
as the corresponding argument to write-file. See Definition of write-file.
This command finds the file file, converting it according to format format. It also makes format the default if the buffer is saved later.
The argument format is a list of format names. If format is
nil, no conversion takes place. Interactively, typing just
RET for format specifies nil.
This command inserts the contents of file file, converting it
according to format format. If beg and end are
non-nil, they specify which part of the file to read, as in
insert-file-contents (see section Reading from Files).
The return value is like what insert-file-contents returns: a
list of the absolute file name and the length of the data inserted
(after conversion).
The argument format is a list of format names. If format is
nil, no conversion takes place. Interactively, typing just
RET for format specifies nil.
This variable specifies the format to use for auto-saving. Its value is
a list of format names, just like the value of
buffer-file-format; however, it is used instead of
buffer-file-format for writing auto-save files. If the value
is t, the default, auto-saving uses the same format as a
regular save in the same buffer. This variable is always buffer-local
in all buffers.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In contrast to the round-trip specification described in the previous
subsection (see section Round-Trip Specification), you can use the variables
after-insert-file-functions and write-region-annotate-functions
to separately control the respective reading and writing conversions.
Conversion starts with one representation and produces another representation. When there is only one conversion to do, there is no conflict about what to start with. However, when there are multiple conversions involved, conflict may arise when two conversions need to start with the same data.
This situation is best understood in the context of converting text
properties during write-region. For example, the character at
position 42 in a buffer is ‘X’ with a text property foo. If
the conversion for foo is done by inserting into the buffer, say,
‘FOO:’, then that changes the character at position 42 from
‘X’ to ‘F’. The next conversion will start with the wrong
data straight away.
To avoid conflict, cooperative conversions do not modify the buffer,
but instead specify annotations, a list of elements of the form
(position . string), sorted in order of increasing
position.
If there is more than one conversion, write-region merges their
annotations destructively into one sorted list. Later, when the text
from the buffer is actually written to the file, it intermixes the
specified annotations at the corresponding positions. All this takes
place without modifying the buffer.
In contrast, when reading, the annotations intermixed with the text
are handled immediately. insert-file-contents sets point to
the beginning of some text to be converted, then calls the conversion
functions with the length of that text. These functions should always
return with point at the beginning of the inserted text. This
approach makes sense for reading because annotations removed by the
first converter can’t be mistakenly processed by a later converter.
Each conversion function should scan for the annotations it
recognizes, remove the annotation, modify the buffer text (to set a
text property, for example), and return the updated length of the
text, as it stands after those changes. The value returned by one
function becomes the argument to the next function.
A list of functions for write-region to call. Each function in
the list is called with two arguments: the start and end of the region
to be written. These functions should not alter the contents of the
buffer. Instead, they should return annotations.
As a special case, a function may return with a different buffer
current. Emacs takes this to mean that the current buffer contains
altered text to be output. It therefore changes the start and
end arguments of the write-region call, giving them the
values of point-min and point-max in the new buffer,
respectively. It also discards all previous annotations, because they
should have been dealt with by this function.
The value of this variable, if non-nil, should be a function.
This function is called, with no arguments, after write-region
has completed.
If any function in write-region-annotate-functions returns with
a different buffer current, Emacs calls
write-region-post-annotation-function more than once. Emacs
calls it with the last buffer that was current, and again with the
buffer before that, and so on back to the original buffer.
Thus, a function in write-region-annotate-functions can create
a buffer, give this variable the local value of kill-buffer in
that buffer, set up the buffer with altered text, and make the buffer
current. The buffer will be killed after write-region is done.
Each function in this list is called by insert-file-contents
with one argument, the number of characters inserted, and with point
at the beginning of the inserted text. Each function should leave
point unchanged, and return the new character count describing the
inserted text as modified by the function.
We invite users to write Lisp programs to store and retrieve text properties in files, using these hooks, and thus to experiment with various data formats and find good ones. Eventually we hope users will produce good, general extensions we can install in Emacs.
We suggest not trying to handle arbitrary Lisp objects as text property names or values—because a program that general is probably difficult to write, and slow. Instead, choose a set of possible data types that are reasonably flexible, and not too hard to encode.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Backup files and auto-save files are two methods by which Emacs tries to protect the user from the consequences of crashes or of the user’s own errors. Auto-saving preserves the text from earlier in the current editing session; backup files preserve file contents prior to the current session.
| 25.1 Backup Files | How backup files are made; how their names are chosen. | |
| 25.2 Auto-Saving | How auto-save files are made; how their names are chosen. | |
| 25.3 Reverting | revert-buffer, and how to customize what it does.
|
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A backup file is a copy of the old contents of a file you are editing. Emacs makes a backup file the first time you save a buffer into its visited file. Thus, normally, the backup file contains the contents of the file as it was before the current editing session. The contents of the backup file normally remain unchanged once it exists.
Backups are usually made by renaming the visited file to a new name. Optionally, you can specify that backup files should be made by copying the visited file. This choice makes a difference for files with multiple names; it also can affect whether the edited file remains owned by the original owner or becomes owned by the user editing it.
By default, Emacs makes a single backup file for each file edited. You can alternatively request numbered backups; then each new backup file gets a new name. You can delete old numbered backups when you don’t want them any more, or Emacs can delete them automatically.
| 25.1.1 Making Backup Files | How Emacs makes backup files, and when. | |
| 25.1.2 Backup by Renaming or by Copying? | Two alternatives: renaming the old file or copying it. | |
| 25.1.3 Making and Deleting Numbered Backup Files | Keeping multiple backups for each source file. | |
| 25.1.4 Naming Backup Files | How backup file names are computed; customization. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This function makes a backup of the file visited by the current
buffer, if appropriate. It is called by save-buffer before
saving the buffer the first time.
If a backup was made by renaming, the return value is a cons cell of
the form (modes extra-alist backupname), where
modes are the mode bits of the original file, as returned by
file-modes (see section Testing Accessibility), extra-alist
is an alist describing the original file’s extended attributes, as
returned by file-extended-attributes (see section Extended File Attributes), and backupname is the name of the backup.
In all other cases (i.e., if a backup was made by copying or if no
backup was made), this function returns nil.
This buffer-local variable says whether this buffer’s file has
been backed up on account of this buffer. If it is non-nil,
the backup file has been written. Otherwise, the file should be backed
up when it is next saved (if backups are enabled). This is a
permanent local; kill-all-local-variables does not alter it.
This variable determines whether or not to make backup files. If it
is non-nil, then Emacs creates a backup of each file when it is
saved for the first time—provided that backup-inhibited
is nil (see below).
The following example shows how to change the make-backup-files
variable only in the Rmail buffers and not elsewhere. Setting it
nil stops Emacs from making backups of these files, which may
save disk space. (You would put this code in your init file.)
(add-hook 'rmail-mode-hook
(lambda () (setq-local make-backup-files nil)))
This variable’s value is a function to be called on certain occasions to
decide whether a file should have backup files. The function receives
one argument, an absolute file name to consider. If the function returns
nil, backups are disabled for that file. Otherwise, the other
variables in this section say whether and how to make backups.
The default value is normal-backup-enable-predicate, which checks
for files in temporary-file-directory and
small-temporary-file-directory.
If this variable is non-nil, backups are inhibited. It records
the result of testing backup-enable-predicate on the visited file
name. It can also coherently be used by other mechanisms that inhibit
backups based on which file is visited. For example, VC sets this
variable non-nil to prevent making backups for files managed
with a version control system.
This is a permanent local, so that changing the major mode does not lose
its value. Major modes should not set this variable—they should set
make-backup-files instead.
This variable’s value is an alist of filename patterns and backup directory names. Each element looks like
(regexp . directory)
Backups of files with names matching regexp will be made in directory. directory may be relative or absolute. If it is absolute, so that all matching files are backed up into the same directory, the file names in this directory will be the full name of the file backed up with all directory separators changed to ‘!’ to prevent clashes. This will not work correctly if your filesystem truncates the resulting name.
For the common case of all backups going into one directory, the alist should contain a single element pairing ‘"."’ with the appropriate directory name.
If this variable is nil (the default), or it fails to match a
filename, the backup is made in the original file’s directory.
On MS-DOS filesystems without long names this variable is always ignored.
This variable’s value is a function to use for making backup file names.
The function make-backup-file-name calls it.
See section Naming Backup Files.
This could be buffer-local to do something special for specific
files. If you change it, you may need to change
backup-file-name-p and file-name-sans-versions too.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
There are two ways that Emacs can make a backup file:
The first method, renaming, is the default.
The variable backup-by-copying, if non-nil, says to use
the second method, which is to copy the original file and overwrite it
with the new buffer contents. The variable file-precious-flag,
if non-nil, also has this effect (as a sideline of its main
significance). See section Saving Buffers.
If this variable is non-nil, Emacs always makes backup files by
copying. The default is nil.
The following three variables, when non-nil, cause the second
method to be used in certain special cases. They have no effect on the
treatment of files that don’t fall into the special cases.
If this variable is non-nil, Emacs makes backups by copying for
files with multiple names (hard links). The default is nil.
This variable is significant only if backup-by-copying is
nil, since copying is always used when that variable is
non-nil.
If this variable is non-nil (the default), Emacs makes backups
by copying in cases where renaming would change either the owner or
the group of the file.
The value has no effect when renaming would not alter the owner or group of the file; that is, for files which are owned by the user and whose group matches the default for a new file created there by the user.
This variable is significant only if backup-by-copying is
nil, since copying is always used when that variable is
non-nil.
This variable, if non-nil, specifies the same behavior as
backup-by-copying-when-mismatch, but only for certain user-id
values: namely, those less than or equal to a certain number. You set
this variable to that number.
Thus, if you set backup-by-copying-when-privileged-mismatch
to 0, backup by copying is done for the superuser only,
when necessary to prevent a change in the owner of the file.
The default is 200.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If a file’s name is foo, the names of its numbered backup versions are foo.~v~, for various integers v, like this: foo.~1~, foo.~2~, foo.~3~, …, foo.~259~, and so on.
This variable controls whether to make a single non-numbered backup file or multiple numbered backups.
nilMake numbered backups if the visited file already has numbered backups; otherwise, do not. This is the default.
neverDo not make numbered backups.
Make numbered backups.
The use of numbered backups ultimately leads to a large number of backup versions, which must then be deleted. Emacs can do this automatically or it can ask the user whether to delete them.
The value of this variable is the number of newest versions to keep when a new numbered backup is made. The newly made backup is included in the count. The default value is 2.
The value of this variable is the number of oldest versions to keep when a new numbered backup is made. The default value is 2.
If there are backups numbered 1, 2, 3, 5, and 7, and both of these
variables have the value 2, then the backups numbered 1 and 2 are kept
as old versions and those numbered 5 and 7 are kept as new versions;
backup version 3 is excess. The function find-backup-file-name
(see section Naming Backup Files) is responsible for determining which backup
versions to delete, but does not delete them itself.
If this variable is t, then saving a file deletes excess
backup versions silently. If it is nil, that means
to ask for confirmation before deleting excess backups.
Otherwise, they are not deleted at all.
This variable specifies how many of the newest backup versions to keep
in the Dired command . (dired-clean-directory). That’s the
same thing kept-new-versions specifies when you make a new backup
file. The default is 2.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The functions in this section are documented mainly because you can customize the naming conventions for backup files by redefining them. If you change one, you probably need to change the rest.
This function returns a non-nil value if filename is a
possible name for a backup file. It just checks the name, not whether
a file with the name filename exists.
(backup-file-name-p "foo")
⇒ nil
(backup-file-name-p "foo~")
⇒ 3
The standard definition of this function is as follows:
(defun backup-file-name-p (file) "Return non-nil if FILE is a backup file \ name (numeric or not)..." (string-match "~\\'" file))
Thus, the function returns a non-nil value if the file name ends
with a ‘~’. (We use a backslash to split the documentation
string’s first line into two lines in the text, but produce just one
line in the string itself.)
This simple expression is placed in a separate function to make it easy to redefine for customization.
This function returns a string that is the name to use for a non-numbered backup file for file filename. On Unix, this is just filename with a tilde appended.
The standard definition of this function, on most operating systems, is as follows:
(defun make-backup-file-name (file) "Create the non-numeric backup file name for FILE..." (concat file "~"))
You can change the backup-file naming convention by redefining this
function. The following example redefines make-backup-file-name
to prepend a ‘.’ in addition to appending a tilde:
(defun make-backup-file-name (filename)
(expand-file-name
(concat "." (file-name-nondirectory filename) "~")
(file-name-directory filename)))
(make-backup-file-name "backups.texi")
⇒ ".backups.texi~"
Some parts of Emacs, including some Dired commands, assume that backup file names end with ‘~’. If you do not follow that convention, it will not cause serious problems, but these commands may give less-than-desirable results.
This function computes the file name for a new backup file for
filename. It may also propose certain existing backup files for
deletion. find-backup-file-name returns a list whose CAR is
the name for the new backup file and whose CDR is a list of backup
files whose deletion is proposed. The value can also be nil,
which means not to make a backup.
Two variables, kept-old-versions and kept-new-versions,
determine which backup versions should be kept. This function keeps
those versions by excluding them from the CDR of the value.
See section Making and Deleting Numbered Backup Files.
In this example, the value says that ~rms/foo.~5~ is the name to use for the new backup file, and ~rms/foo.~3~ is an “excess” version that the caller should consider deleting now.
(find-backup-file-name "~rms/foo")
⇒ ("~rms/foo.~5~" "~rms/foo.~3~")
This function returns the name of the most recent backup file for
filename, or nil if that file has no backup files.
Some file comparison commands use this function so that they can automatically compare a file with its most recent backup.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs periodically saves all files that you are visiting; this is called auto-saving. Auto-saving prevents you from losing more than a limited amount of work if the system crashes. By default, auto-saves happen every 300 keystrokes, or after around 30 seconds of idle time. See Auto-Saving: Protection Against Disasters in The GNU Emacs Manual, for information on auto-save for users. Here we describe the functions used to implement auto-saving and the variables that control them.
This buffer-local variable is the name of the file used for
auto-saving the current buffer. It is nil if the buffer
should not be auto-saved.
buffer-auto-save-file-name
⇒ "/xcssun/users/rms/lewis/#backups.texi#"
This is the mode command for Auto Save mode, a buffer-local minor mode. When Auto Save mode is enabled, auto-saving is enabled in the buffer. The calling convention is the same as for other minor mode commands (see section Conventions for Writing Minor Modes).
Unlike most minor modes, there is no auto-save-mode variable.
Auto Save mode is enabled if buffer-auto-save-file-name is
non-nil and buffer-saved-size (see below) is non-zero.
This function returns a non-nil value if filename is a
string that could be the name of an auto-save file. It assumes
the usual naming convention for auto-save files: a name that
begins and ends with hash marks (‘#’) is a possible auto-save file
name. The argument filename should not contain a directory part.
(make-auto-save-file-name)
⇒ "/xcssun/users/rms/lewis/#backups.texi#"
(auto-save-file-name-p "#backups.texi#")
⇒ 0
(auto-save-file-name-p "backups.texi")
⇒ nil
The standard definition of this function is as follows:
(defun auto-save-file-name-p (filename) "Return non-nil if FILENAME can be yielded by..." (string-match "^#.*#$" filename))
This function exists so that you can customize it if you wish to
change the naming convention for auto-save files. If you redefine it,
be sure to redefine the function make-auto-save-file-name
correspondingly.
This function returns the file name to use for auto-saving the current
buffer. This is just the file name with hash marks (‘#’) prepended
and appended to it. This function does not look at the variable
auto-save-visited-file-name (described below); callers of this
function should check that variable first.
(make-auto-save-file-name)
⇒ "/xcssun/users/rms/lewis/#backups.texi#"
Here is a simplified version of the standard definition of this function:
(defun make-auto-save-file-name () "Return file name to use for auto-saves \ of current buffer.." (if buffer-file-name
(concat
(file-name-directory buffer-file-name)
"#"
(file-name-nondirectory buffer-file-name)
"#")
(expand-file-name
(concat "#%" (buffer-name) "#"))))
This exists as a separate function so that you can redefine it to
customize the naming convention for auto-save files. Be sure to
change auto-save-file-name-p in a corresponding way.
If this variable is non-nil, Emacs auto-saves buffers in
the files they are visiting. That is, the auto-save is done in the same
file that you are editing. Normally, this variable is nil, so
auto-save files have distinct names that are created by
make-auto-save-file-name.
When you change the value of this variable, the new value does not take
effect in an existing buffer until the next time auto-save mode is
reenabled in it. If auto-save mode is already enabled, auto-saves
continue to go in the same file name until auto-save-mode is
called again.
This function returns t if the current buffer has been
auto-saved since the last time it was read in or saved.
This function marks the current buffer as auto-saved. The buffer will
not be auto-saved again until the buffer text is changed again. The
function returns nil.
The value of this variable specifies how often to do auto-saving, in terms of number of input events. Each time this many additional input events are read, Emacs does auto-saving for all buffers in which that is enabled. Setting this to zero disables autosaving based on the number of characters typed.
The value of this variable is the number of seconds of idle time that should cause auto-saving. Each time the user pauses for this long, Emacs does auto-saving for all buffers in which that is enabled. (If the current buffer is large, the specified timeout is multiplied by a factor that increases as the size increases; for a million-byte buffer, the factor is almost 4.)
If the value is zero or nil, then auto-saving is not done as a
result of idleness, only after a certain number of input events as
specified by auto-save-interval.
This normal hook is run whenever an auto-save is about to happen.
If this variable is non-nil, buffers that are visiting files
have auto-saving enabled by default. Otherwise, they do not.
This function auto-saves all buffers that need to be auto-saved. It saves all buffers for which auto-saving is enabled and that have been changed since the previous auto-save.
If any buffers are auto-saved, do-auto-save normally displays a
message saying ‘Auto-saving...’ in the echo area while
auto-saving is going on. However, if no-message is
non-nil, the message is inhibited.
If current-only is non-nil, only the current buffer
is auto-saved.
This function deletes the current buffer’s auto-save file if
delete-auto-save-files is non-nil. It is called every
time a buffer is saved.
Unless force is non-nil, this function only deletes the
file if it was written by the current Emacs session since the last
true save.
This variable is used by the function
delete-auto-save-file-if-necessary. If it is non-nil,
Emacs deletes auto-save files when a true save is done (in the visited
file). This saves disk space and unclutters your directory.
This function adjusts the current buffer’s auto-save file name if the visited file name has changed. It also renames an existing auto-save file, if it was made in the current Emacs session. If the visited file name has not changed, this function does nothing.
The value of this buffer-local variable is the length of the current buffer, when it was last read in, saved, or auto-saved. This is used to detect a substantial decrease in size, and turn off auto-saving in response.
If it is -1, that means auto-saving is temporarily shut off in this buffer due to a substantial decrease in size. Explicitly saving the buffer stores a positive value in this variable, thus reenabling auto-saving. Turning auto-save mode off or on also updates this variable, so that the substantial decrease in size is forgotten.
If it is -2, that means this buffer should disregard changes in buffer size; in particular, it should not shut off auto-saving temporarily due to changes in buffer size.
This variable (if non-nil) specifies a file for recording the
names of all the auto-save files. Each time Emacs does auto-saving, it
writes two lines into this file for each buffer that has auto-saving
enabled. The first line gives the name of the visited file (it’s empty
if the buffer has none), and the second gives the name of the auto-save
file.
When Emacs exits normally, it deletes this file; if Emacs crashes, you
can look in the file to find all the auto-save files that might contain
work that was otherwise lost. The recover-session command uses
this file to find them.
The default name for this file specifies your home directory and starts with ‘.saves-’. It also contains the Emacs process ID and the host name.
After Emacs reads your init file, it initializes
auto-save-list-file-name (if you have not already set it
non-nil) based on this prefix, adding the host name and process
ID. If you set this to nil in your init file, then Emacs does
not initialize auto-save-list-file-name.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If you have made extensive changes to a file and then change your mind
about them, you can get rid of them by reading in the previous version
of the file with the revert-buffer command. See Reverting a Buffer in The GNU Emacs Manual.
This command replaces the buffer text with the text of the visited file on disk. This action undoes all changes since the file was visited or saved.
By default, if the latest auto-save file is more recent than the visited
file, and the argument ignore-auto is nil,
revert-buffer asks the user whether to use that auto-save
instead. When you invoke this command interactively, ignore-auto
is t if there is no numeric prefix argument; thus, the
interactive default is not to check the auto-save file.
Normally, revert-buffer asks for confirmation before it changes
the buffer; but if the argument noconfirm is non-nil,
revert-buffer does not ask for confirmation.
Normally, this command reinitializes the buffer’s major and minor modes
using normal-mode. But if preserve-modes is
non-nil, the modes remain unchanged.
Reverting tries to preserve marker positions in the buffer by using the
replacement feature of insert-file-contents. If the buffer
contents and the file contents are identical before the revert
operation, reverting preserves all the markers. If they are not
identical, reverting does change the buffer; in that case, it preserves
the markers in the unchanged text (if any) at the beginning and end of
the buffer. Preserving any additional markers would be problematical.
revert-buffer binds this variable to a non-nil value
while it is working.
You can customize how revert-buffer does its work by setting
the variables described in the rest of this section.
This variable holds a list of files that should be reverted without
query. The value is a list of regular expressions. If the visited file
name matches one of these regular expressions, and the file has changed
on disk but the buffer is not modified, then revert-buffer
reverts the file without asking the user for confirmation.
Some major modes customize revert-buffer by making
buffer-local bindings for these variables:
The value of this variable is the function to use to revert this
buffer. It should be a function with two optional
arguments to do the work of reverting. The two optional arguments,
ignore-auto and noconfirm, are the arguments that
revert-buffer received.
Modes such as Dired mode, in which the text being edited does not consist of a file’s contents but can be regenerated in some other fashion, can give this variable a buffer-local value that is a special function to regenerate the contents.
The value of this variable specifies the function to use to
insert the updated contents when reverting this buffer. The function
receives two arguments: first the file name to use; second, t if
the user has asked to read the auto-save file.
The reason for a mode to change this variable instead of
revert-buffer-function is to avoid duplicating or replacing the
rest of what revert-buffer does: asking for confirmation,
clearing the undo list, deciding the proper major mode, and running the
hooks listed below.
This normal hook is run by the default revert-buffer-function
before inserting the modified contents. A custom revert-buffer-function
may or may not run this hook.
This normal hook is run by the default revert-buffer-function
after inserting the modified contents. A custom revert-buffer-function
may or may not run this hook.
The value of this variable specifies a function to call to check whether a buffer needs reverting. The default value only handles buffers that are visiting files, by checking their modification time. Buffers that are not visiting files require a custom function (see (emacs)Supporting additional buffers).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A buffer is a Lisp object containing text to be edited. Buffers are used to hold the contents of files that are being visited; there may also be buffers that are not visiting files. While several buffers may exist at one time, only one buffer is designated the current buffer at any time. Most editing commands act on the contents of the current buffer. Each buffer, including the current buffer, may or may not be displayed in any windows.
| 26.1 Buffer Basics | What is a buffer? | |
| 26.2 The Current Buffer | Designating a buffer as current so that primitives will access its contents. | |
| 26.3 Buffer Names | Accessing and changing buffer names. | |
| 26.4 Buffer File Name | The buffer file name indicates which file is visited. | |
| 26.5 Buffer Modification | A buffer is modified if it needs to be saved. | |
| 26.6 Buffer Modification Time | Determining whether the visited file was changed "behind Emacs’s back". | |
| 26.7 Read-Only Buffers | Modifying text is not allowed in a read-only buffer. | |
| 26.8 The Buffer List | How to look at all the existing buffers. | |
| 26.9 Creating Buffers | Functions that create buffers. | |
| 26.10 Killing Buffers | Buffers exist until explicitly killed. | |
| 26.11 Indirect Buffers | An indirect buffer shares text with some other buffer. | |
| 26.12 Swapping Text Between Two Buffers | Swapping text between two buffers. | |
| 26.13 The Buffer Gap | The gap in the buffer. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A buffer is a Lisp object containing text to be edited. Buffers are used to hold the contents of files that are being visited; there may also be buffers that are not visiting files. Although several buffers normally exist, only one buffer is designated the current buffer at any time. Most editing commands act on the contents of the current buffer. Each buffer, including the current buffer, may or may not be displayed in any windows.
Buffers in Emacs editing are objects that have distinct names and hold text that can be edited. Buffers appear to Lisp programs as a special data type. You can think of the contents of a buffer as a string that you can extend; insertions and deletions may occur in any part of the buffer. See section Text.
A Lisp buffer object contains numerous pieces of information. Some of this information is directly accessible to the programmer through variables, while other information is accessible only through special-purpose functions. For example, the visited file name is directly accessible through a variable, while the value of point is accessible only through a primitive function.
Buffer-specific information that is directly accessible is stored in
buffer-local variable bindings, which are variable values that are
effective only in a particular buffer. This feature allows each buffer
to override the values of certain variables. Most major modes override
variables such as fill-column or comment-column in this
way. For more information about buffer-local variables and functions
related to them, see Buffer-Local Variables.
For functions and variables related to visiting files in buffers, see Visiting Files and Saving Buffers. For functions and variables related to the display of buffers in windows, see Buffers and Windows.
This function returns t if object is a buffer,
nil otherwise.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
There are, in general, many buffers in an Emacs session. At any time, one of them is designated the current buffer—the buffer in which most editing takes place. Most of the primitives for examining or changing text operate implicitly on the current buffer (see section Text).
Normally, the buffer displayed in the selected window is the current
buffer, but this is not always so: a Lisp program can temporarily
designate any buffer as current in order to operate on its contents,
without changing what is displayed on the screen. The most basic
function for designating a current buffer is set-buffer.
This function returns the current buffer.
(current-buffer)
⇒ #<buffer buffers.texi>
This function makes buffer-or-name the current buffer. buffer-or-name must be an existing buffer or the name of an existing buffer. The return value is the buffer made current.
This function does not display the buffer in any window, so the user cannot necessarily see the buffer. But Lisp programs will now operate on it.
When an editing command returns to the editor command loop, Emacs
automatically calls set-buffer on the buffer shown in the
selected window. This is to prevent confusion: it ensures that the
buffer that the cursor is in, when Emacs reads a command, is the
buffer to which that command applies (see section Command Loop). Thus,
you should not use set-buffer to switch visibly to a different
buffer; for that, use the functions described in Switching to a Buffer in a Window.
When writing a Lisp function, do not rely on this behavior of the command loop to restore the current buffer after an operation. Editing commands can also be called as Lisp functions by other programs, not just from the command loop; it is convenient for the caller if the subroutine does not change which buffer is current (unless, of course, that is the subroutine’s purpose).
To operate temporarily on another buffer, put the set-buffer
within a save-current-buffer form. Here, as an example, is a
simplified version of the command append-to-buffer:
(defun append-to-buffer (buffer start end)
"Append the text of the region to BUFFER."
(interactive "BAppend to buffer: \nr")
(let ((oldbuf (current-buffer)))
(save-current-buffer
(set-buffer (get-buffer-create buffer))
(insert-buffer-substring oldbuf start end))))
Here, we bind a local variable to record the current buffer, and then
save-current-buffer arranges to make it current again later.
Next, set-buffer makes the specified buffer current, and
insert-buffer-substring copies the string from the original
buffer to the specified (and now current) buffer.
Alternatively, we can use the with-current-buffer macro:
(defun append-to-buffer (buffer start end)
"Append the text of the region to BUFFER."
(interactive "BAppend to buffer: \nr")
(let ((oldbuf (current-buffer)))
(with-current-buffer (get-buffer-create buffer)
(insert-buffer-substring oldbuf start end))))
In either case, if the buffer appended to happens to be displayed in some window, the next redisplay will show how its text has changed. If it is not displayed in any window, you will not see the change immediately on the screen. The command causes the buffer to become current temporarily, but does not cause it to be displayed.
If you make local bindings (with let or function arguments)
for a variable that may also have buffer-local bindings, make sure
that the same buffer is current at the beginning and at the end of the
local binding’s scope. Otherwise you might bind it in one buffer and
unbind it in another!
Do not rely on using set-buffer to change the current buffer
back, because that won’t do the job if a quit happens while the wrong
buffer is current. For instance, in the previous example, it would
have been wrong to do this:
(let ((oldbuf (current-buffer)))
(set-buffer (get-buffer-create buffer))
(insert-buffer-substring oldbuf start end)
(set-buffer oldbuf))
Using save-current-buffer or with-current-buffer, as we
did, correctly handles quitting, errors, and throw, as well as
ordinary evaluation.
The save-current-buffer special form saves the identity of the
current buffer, evaluates the body forms, and finally restores
that buffer as current. The return value is the value of the last
form in body. The current buffer is restored even in case of an
abnormal exit via throw or error (see section Nonlocal Exits).
If the buffer that used to be current has been killed by the time of
exit from save-current-buffer, then it is not made current again,
of course. Instead, whichever buffer was current just before exit
remains current.
The with-current-buffer macro saves the identity of the current
buffer, makes buffer-or-name current, evaluates the body
forms, and finally restores the current buffer. buffer-or-name
must specify an existing buffer or the name of an existing buffer.
The return value is the value of the last form in body. The
current buffer is restored even in case of an abnormal exit via
throw or error (see section Nonlocal Exits).
The with-temp-buffer macro evaluates the body forms
with a temporary buffer as the current buffer. It saves the identity of
the current buffer, creates a temporary buffer and makes it current,
evaluates the body forms, and finally restores the previous
current buffer while killing the temporary buffer. By default, undo
information (see section Undo) is not recorded in the buffer created by
this macro (but body can enable that, if needed).
The return value is the value of the last form in body. You can
return the contents of the temporary buffer by using
(buffer-string) as the last form.
The current buffer is restored even in case of an abnormal exit via
throw or error (see section Nonlocal Exits).
See also with-temp-file in Writing to Files.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Each buffer has a unique name, which is a string. Many of the functions that work on buffers accept either a buffer or a buffer name as an argument. Any argument called buffer-or-name is of this sort, and an error is signaled if it is neither a string nor a buffer. Any argument called buffer must be an actual buffer object, not a name.
Buffers that are ephemeral and generally uninteresting to the user
have names starting with a space, so that the list-buffers and
buffer-menu commands don’t mention them (but if such a buffer
visits a file, it is mentioned). A name starting with
space also initially disables recording undo information; see
Undo.
This function returns the name of buffer as a string. buffer defaults to the current buffer.
If buffer-name returns nil, it means that buffer
has been killed. See section Killing Buffers.
(buffer-name)
⇒ "buffers.texi"
(setq foo (get-buffer "temp"))
⇒ #<buffer temp>
(kill-buffer foo)
⇒ nil
(buffer-name foo)
⇒ nil
foo
⇒ #<killed buffer>
This function renames the current buffer to newname. An error is signaled if newname is not a string.
Ordinarily, rename-buffer signals an error if newname is
already in use. However, if unique is non-nil, it modifies
newname to make a name that is not in use. Interactively, you can
make unique non-nil with a numeric prefix argument.
(This is how the command rename-uniquely is implemented.)
This function returns the name actually given to the buffer.
This function returns the buffer specified by buffer-or-name.
If buffer-or-name is a string and there is no buffer with that
name, the value is nil. If buffer-or-name is a buffer, it
is returned as given; that is not very useful, so the argument is usually
a name. For example:
(setq b (get-buffer "lewis"))
⇒ #<buffer lewis>
(get-buffer b)
⇒ #<buffer lewis>
(get-buffer "Frazzle-nots")
⇒ nil
See also the function get-buffer-create in Creating Buffers.
This function returns a name that would be unique for a new buffer—but does not create the buffer. It starts with starting-name, and produces a name not currently in use for any buffer by appending a number inside of ‘<…>’. It starts at 2 and keeps incrementing the number until it is not the name of an existing buffer.
If the optional second argument ignore is non-nil, it
should be a string, a potential buffer name. It means to consider
that potential buffer acceptable, if it is tried, even it is the name
of an existing buffer (which would normally be rejected). Thus, if
buffers named ‘foo’, ‘foo<2>’, ‘foo<3>’ and
‘foo<4>’ exist,
(generate-new-buffer-name "foo")
⇒ "foo<5>"
(generate-new-buffer-name "foo" "foo<3>")
⇒ "foo<3>"
(generate-new-buffer-name "foo" "foo<6>")
⇒ "foo<5>"
See the related function generate-new-buffer in Creating Buffers.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The buffer file name is the name of the file that is visited in
that buffer. When a buffer is not visiting a file, its buffer file name
is nil. Most of the time, the buffer name is the same as the
nondirectory part of the buffer file name, but the buffer file name and
the buffer name are distinct and can be set independently.
See section Visiting Files.
This function returns the absolute file name of the file that
buffer is visiting. If buffer is not visiting any file,
buffer-file-name returns nil. If buffer is not
supplied, it defaults to the current buffer.
(buffer-file-name (other-buffer))
⇒ "/usr/user/lewis/manual/files.texi"
This buffer-local variable contains the name of the file being visited
in the current buffer, or nil if it is not visiting a file. It
is a permanent local variable, unaffected by
kill-all-local-variables.
buffer-file-name
⇒ "/usr/user/lewis/manual/buffers.texi"
It is risky to change this variable’s value without doing various other
things. Normally it is better to use set-visited-file-name (see
below); some of the things done there, such as changing the buffer name,
are not strictly necessary, but others are essential to avoid confusing
Emacs.
This buffer-local variable holds the abbreviated truename of the file
visited in the current buffer, or nil if no file is visited.
It is a permanent local, unaffected by
kill-all-local-variables. See section Truenames, and
abbreviate-file-name.
This buffer-local variable holds the file number and directory device
number of the file visited in the current buffer, or nil if no
file or a nonexistent file is visited. It is a permanent local,
unaffected by kill-all-local-variables.
The value is normally a list of the form (filenum
devnum). This pair of numbers uniquely identifies the file among
all files accessible on the system. See the function
file-attributes, in File Attributes, for more information
about them.
If buffer-file-name is the name of a symbolic link, then both
numbers refer to the recursive target.
This function returns the buffer visiting file filename. If
there is no such buffer, it returns nil. The argument
filename, which must be a string, is expanded (see section Functions that Expand Filenames), then compared against the visited file names of all live
buffers. Note that the buffer’s buffer-file-name must match
the expansion of filename exactly. This function will not
recognize other names for the same file.
(get-file-buffer "buffers.texi")
⇒ #<buffer buffers.texi>
In unusual circumstances, there can be more than one buffer visiting the same file name. In such cases, this function returns the first such buffer in the buffer list.
This is like get-file-buffer, except that it can return any
buffer visiting the file possibly under a different name. That
is, the buffer’s buffer-file-name does not need to match the
expansion of filename exactly, it only needs to refer to the
same file. If predicate is non-nil, it should be a
function of one argument, a buffer visiting filename. The
buffer is only considered a suitable return value if predicate
returns non-nil. If it can not find a suitable buffer to
return, find-buffer-visiting returns nil.
If filename is a non-empty string, this function changes the name of the file visited in the current buffer to filename. (If the buffer had no visited file, this gives it one.) The next time the buffer is saved it will go in the newly-specified file.
This command marks the buffer as modified, since it does not (as far as Emacs knows) match the contents of filename, even if it matched the former visited file. It also renames the buffer to correspond to the new file name, unless the new name is already in use.
If filename is nil or the empty string, that stands for
“no visited file”. In this case, set-visited-file-name marks
the buffer as having no visited file, without changing the buffer’s
modified flag.
Normally, this function asks the user for confirmation if there
already is a buffer visiting filename. If no-query is
non-nil, that prevents asking this question. If there already
is a buffer visiting filename, and the user confirms or
no-query is non-nil, this function makes the new
buffer name unique by appending a number inside of ‘<…>’ to
filename.
If along-with-file is non-nil, that means to assume that
the former visited file has been renamed to filename. In this
case, the command does not change the buffer’s modified flag, nor the
buffer’s recorded last file modification time as reported by
visited-file-modtime (see section Buffer Modification Time). If
along-with-file is nil, this function clears the recorded
last file modification time, after which visited-file-modtime
returns zero.
When the function set-visited-file-name is called
interactively, it prompts for filename in the minibuffer.
This buffer-local variable specifies a string to display in a buffer listing where the visited file name would go, for buffers that don’t have a visited file name. Dired buffers use this variable.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs keeps a flag called the modified flag for each buffer, to
record whether you have changed the text of the buffer. This flag is
set to t whenever you alter the contents of the buffer, and
cleared to nil when you save it. Thus, the flag shows whether
there are unsaved changes. The flag value is normally shown in the mode
line (see section Variables Used in the Mode Line), and controls saving (see section Saving Buffers) and auto-saving (see section Auto-Saving).
Some Lisp programs set the flag explicitly. For example, the function
set-visited-file-name sets the flag to t, because the text
does not match the newly-visited file, even if it is unchanged from the
file formerly visited.
The functions that modify the contents of buffers are described in Text.
This function returns t if the buffer buffer has been modified
since it was last read in from a file or saved, or nil
otherwise. If buffer is not supplied, the current buffer
is tested.
This function marks the current buffer as modified if flag is
non-nil, or as unmodified if the flag is nil.
Another effect of calling this function is to cause unconditional
redisplay of the mode line for the current buffer. In fact, the
function force-mode-line-update works by doing this:
(set-buffer-modified-p (buffer-modified-p))
Like set-buffer-modified-p, but does not force redisplay
of mode lines.
This command marks the current buffer as unmodified, and not needing
to be saved. If arg is non-nil, it marks the buffer as
modified, so that it will be saved at the next suitable occasion.
Interactively, arg is the prefix argument.
Don’t use this function in programs, since it prints a message in the
echo area; use set-buffer-modified-p (above) instead.
This function returns buffer’s modification-count. This is a
counter that increments every time the buffer is modified. If
buffer is nil (or omitted), the current buffer is used.
The counter can wrap around occasionally.
This function returns buffer’s character-change modification-count.
Changes to text properties leave this counter unchanged; however, each
time text is inserted or removed from the buffer, the counter is reset
to the value that would be returned by buffer-modified-tick.
By comparing the values returned by two buffer-chars-modified-tick
calls, you can tell whether a character change occurred in that buffer
in between the calls. If buffer is nil (or omitted), the
current buffer is used.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Suppose that you visit a file and make changes in its buffer, and meanwhile the file itself is changed on disk. At this point, saving the buffer would overwrite the changes in the file. Occasionally this may be what you want, but usually it would lose valuable information. Emacs therefore checks the file’s modification time using the functions described below before saving the file. (See section File Attributes, for how to examine a file’s modification time.)
This function compares what buffer (by default, the current-buffer) has recorded for the modification time of its visited file against the actual modification time of the file as recorded by the operating system. The two should be the same unless some other process has written the file since Emacs visited or saved it.
The function returns t if the last actual modification time and
Emacs’s recorded modification time are the same, nil otherwise.
It also returns t if the buffer has no recorded last
modification time, that is if visited-file-modtime would return
zero.
It always returns t for buffers that are not visiting a file,
even if visited-file-modtime returns a non-zero value. For
instance, it always returns t for dired buffers. It returns
t for buffers that are visiting a file that does not exist and
never existed, but nil for file-visiting buffers whose file has
been deleted.
This function clears out the record of the last modification time of the file being visited by the current buffer. As a result, the next attempt to save this buffer will not complain of a discrepancy in file modification times.
This function is called in set-visited-file-name and other
exceptional places where the usual test to avoid overwriting a changed
file should not be done.
This function returns the current buffer’s recorded last file
modification time, as a list of the form (high low
microsec picosec). (This is the same format that
file-attributes uses to return time values; see section File Attributes.)
If the buffer has no recorded last modification time, this function
returns zero. This case occurs, for instance, if the buffer is not
visiting a file or if the time has been explicitly cleared by
clear-visited-file-modtime. Note, however, that
visited-file-modtime returns a list for some non-file buffers
too. For instance, in a Dired buffer listing a directory, it returns
the last modification time of that directory, as recorded by Dired.
If the buffer is not visiting a file, this function returns -1.
This function updates the buffer’s record of the last modification time
of the visited file, to the value specified by time if time
is not nil, and otherwise to the last modification time of the
visited file.
If time is neither nil nor zero, it should have the form
(high low microsec picosec),
the format used by current-time (see section Time of Day).
This function is useful if the buffer was not read from the file normally, or if the file itself has been changed for some known benign reason.
This function is used to ask a user how to proceed after an attempt to modify an buffer visiting file filename when the file is newer than the buffer text. Emacs detects this because the modification time of the file on disk is newer than the last save-time of the buffer. This means some other program has probably altered the file.
Depending on the user’s answer, the function may return normally, in
which case the modification of the buffer proceeds, or it may signal a
file-supersession error with data (filename), in which
case the proposed buffer modification is not allowed.
This function is called automatically by Emacs on the proper occasions. It exists so you can customize Emacs by redefining it. See the file userlock.el for the standard definition.
See also the file locking mechanism in File Locks.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If a buffer is read-only, then you cannot change its contents, although you may change your view of the contents by scrolling and narrowing.
Read-only buffers are used in two kinds of situations:
Here, the purpose is to inform the user that editing the buffer with the aim of saving it in the file may be futile or undesirable. The user who wants to change the buffer text despite this can do so after clearing the read-only flag with C-x C-q.
The special commands of these modes bind buffer-read-only to
nil (with let) or bind inhibit-read-only to
t around the places where they themselves change the text.
This buffer-local variable specifies whether the buffer is read-only.
The buffer is read-only if this variable is non-nil.
If this variable is non-nil, then read-only buffers and,
depending on the actual value, some or all read-only characters may be
modified. Read-only characters in a buffer are those that have a
non-nil read-only text property. See section Properties with Special Meanings, for more information about text properties.
If inhibit-read-only is t, all read-only character
properties have no effect. If inhibit-read-only is a list, then
read-only character properties have no effect if they are members
of the list (comparison is done with eq).
This is the mode command for Read Only minor mode, a buffer-local
minor mode. When the mode is enabled, buffer-read-only is
non-nil in the buffer; when disabled, buffer-read-only
is nil in the buffer. The calling convention is the same as
for other minor mode commands (see section Conventions for Writing Minor Modes).
This minor mode mainly serves as a wrapper for
buffer-read-only; unlike most minor modes, there is no separate
read-only-mode variable. Even when Read Only mode is disabled,
characters with non-nil read-only text properties remain
read-only. To temporarily ignore all read-only states, bind
inhibit-read-only, as described above.
When enabling Read Only mode, this mode command also enables View mode
if the option view-read-only is non-nil. See Miscellaneous Buffer Operations in The GNU Emacs Manual.
When disabling Read Only mode, it disables View mode if View mode was
enabled.
This function signals a buffer-read-only error if the current
buffer is read-only. See section Using interactive, for another way to
signal an error if the current buffer is read-only.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The buffer list is a list of all live buffers. The order of the
buffers in this list is based primarily on how recently each buffer has
been displayed in a window. Several functions, notably
other-buffer, use this ordering. A buffer list displayed for the
user also follows this order.
Creating a buffer adds it to the end of the buffer list, and killing
a buffer removes it from that list. A buffer moves to the front of
this list whenever it is chosen for display in a window
(see section Switching to a Buffer in a Window) or a window displaying it is selected
(see section Selecting Windows). A buffer moves to the end of the list
when it is buried (see bury-buffer, below). There are no
functions available to the Lisp programmer which directly manipulate
the buffer list.
In addition to the fundamental buffer list just described, Emacs
maintains a local buffer list for each frame, in which the buffers that
have been displayed (or had their windows selected) in that frame come
first. (This order is recorded in the frame’s buffer-list frame
parameter; see Buffer Parameters.) Buffers never displayed in
that frame come afterward, ordered according to the fundamental buffer
list.
This function returns the buffer list, including all buffers, even those whose names begin with a space. The elements are actual buffers, not their names.
If frame is a frame, this returns frame’s local buffer list.
If frame is nil or omitted, the fundamental buffer list is
used: the buffers appear in order of most recent display or selection,
regardless of which frames they were displayed on.
(buffer-list)
⇒ (#<buffer buffers.texi>
#<buffer *Minibuf-1*> #<buffer buffer.c>
#<buffer *Help*> #<buffer TAGS>)
;; Note that the name of the minibuffer ;; begins with a space! (mapcar (function buffer-name) (buffer-list)) ⇒ ("buffers.texi" " *Minibuf-1*" "buffer.c" "*Help*" "TAGS")
The list returned by buffer-list is constructed specifically;
it is not an internal Emacs data structure, and modifying it has no
effect on the order of buffers. If you want to change the order of
buffers in the fundamental buffer list, here is an easy way:
(defun reorder-buffer-list (new-list)
(while new-list
(bury-buffer (car new-list))
(setq new-list (cdr new-list))))
With this method, you can specify any order for the list, but there is no danger of losing a buffer or adding something that is not a valid live buffer.
To change the order or value of a specific frame’s buffer list, set
that frame’s buffer-list parameter with
modify-frame-parameters (see section Access to Frame Parameters).
This function returns the first buffer in the buffer list other than buffer. Usually, this is the buffer appearing in the most recently selected window (in frame frame or else the selected frame, see section Input Focus), aside from buffer. Buffers whose names start with a space are not considered at all.
If buffer is not supplied (or if it is not a live buffer), then
other-buffer returns the first buffer in the selected frame’s
local buffer list. (If frame is non-nil, it returns the
first buffer in frame’s local buffer list instead.)
If frame has a non-nil buffer-predicate parameter,
then other-buffer uses that predicate to decide which buffers to
consider. It calls the predicate once for each buffer, and if the value
is nil, that buffer is ignored. See section Buffer Parameters.
If visible-ok is nil, other-buffer avoids returning
a buffer visible in any window on any visible frame, except as a last
resort. If visible-ok is non-nil, then it does not matter
whether a buffer is displayed somewhere or not.
If no suitable buffer exists, the buffer *scratch* is returned (and created, if necessary).
This function returns the last buffer in frame’s buffer list other
than buffer. If frame is omitted or nil, it uses the
selected frame’s buffer list.
The argument visible-ok is handled as with other-buffer,
see above. If no suitable buffer can be found, the buffer
*scratch* is returned.
This command puts buffer-or-name at the end of the buffer list,
without changing the order of any of the other buffers on the list.
This buffer therefore becomes the least desirable candidate for
other-buffer to return. The argument can be either a buffer
itself or the name of one.
This function operates on each frame’s buffer-list parameter as
well as the fundamental buffer list; therefore, the buffer that you bury
will come last in the value of (buffer-list frame) and in
the value of (buffer-list). In addition, it also puts the buffer
at the end of the list of buffer of the selected window (see section Window History) provided it is shown in that window.
If buffer-or-name is nil or omitted, this means to bury the
current buffer. In addition, if the current buffer is displayed in the
selected window, this makes sure that the window is either deleted or
another buffer is shown in it. More precisely, if the selected window
is dedicated (see section Dedicated Windows) and there are other windows on
its frame, the window is deleted. If it is the only window on its frame
and that frame is not the only frame on its terminal, the frame is
“dismissed” by calling the function specified by
frame-auto-hide-function (see section Quitting Windows). Otherwise,
it calls switch-to-prev-buffer (see section Window History) to show
another buffer in that window. If buffer-or-name is displayed in
some other window, it remains displayed there.
To replace a buffer in all the windows that display it, use
replace-buffer-in-windows, See section Buffers and Windows.
This command switches to the last buffer in the local buffer list of
the selected frame. More precisely, it calls the function
switch-to-buffer (see section Switching to a Buffer in a Window), to display the
buffer returned by last-buffer (see above), in the selected
window.
This is a normal hook run whenever the buffer list changes. Functions
(implicitly) running this hook are get-buffer-create
(see section Creating Buffers), rename-buffer (see section Buffer Names),
kill-buffer (see section Killing Buffers), bury-buffer (see
above) and select-window (see section Selecting Windows).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes the two primitives for creating buffers.
get-buffer-create creates a buffer if it finds no existing buffer
with the specified name; generate-new-buffer always creates a new
buffer and gives it a unique name.
Other functions you can use to create buffers include
with-output-to-temp-buffer (see section Temporary Displays) and
create-file-buffer (see section Visiting Files). Starting a
subprocess can also create a buffer (see section Processes).
This function returns a buffer named buffer-or-name. The buffer returned does not become the current buffer—this function does not change which buffer is current.
buffer-or-name must be either a string or an existing buffer. If
it is a string and a live buffer with that name already exists,
get-buffer-create returns that buffer. If no such buffer exists,
it creates a new buffer. If buffer-or-name is a buffer instead of
a string, it is returned as given, even if it is dead.
(get-buffer-create "foo")
⇒ #<buffer foo>
The major mode for a newly created buffer is set to Fundamental mode.
(The default value of the variable major-mode is handled at a higher
level; see How Emacs Chooses a Major Mode.) If the name begins with a space, the
buffer initially disables undo information recording (see section Undo).
This function returns a newly created, empty buffer, but does not make
it current. The name of the buffer is generated by passing name
to the function generate-new-buffer-name (see section Buffer Names). Thus, if there is no buffer named name, then that is
the name of the new buffer; if that name is in use, a suffix of the
form ‘<n>’, where n is an integer, is appended to
name.
An error is signaled if name is not a string.
(generate-new-buffer "bar")
⇒ #<buffer bar>
(generate-new-buffer "bar")
⇒ #<buffer bar<2>>
(generate-new-buffer "bar")
⇒ #<buffer bar<3>>
The major mode for the new buffer is set to Fundamental mode. The default
value of the variable major-mode is handled at a higher level.
See section How Emacs Chooses a Major Mode.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Killing a buffer makes its name unknown to Emacs and makes the memory space it occupied available for other use.
The buffer object for the buffer that has been killed remains in
existence as long as anything refers to it, but it is specially marked
so that you cannot make it current or display it. Killed buffers retain
their identity, however; if you kill two distinct buffers, they remain
distinct according to eq although both are dead.
If you kill a buffer that is current or displayed in a window, Emacs automatically selects or displays some other buffer instead. This means that killing a buffer can change the current buffer. Therefore, when you kill a buffer, you should also take the precautions associated with changing the current buffer (unless you happen to know that the buffer being killed isn’t current). See section The Current Buffer.
If you kill a buffer that is the base buffer of one or more indirect buffers (see section Indirect Buffers), the indirect buffers are automatically killed as well.
The buffer-name of a buffer is nil if, and only if,
the buffer is killed. A buffer that has not been killed is called a
live buffer. To test whether a buffer is live or killed, use
the function buffer-live-p (see below).
This function kills the buffer buffer-or-name, freeing all its
memory for other uses or to be returned to the operating system. If
buffer-or-name is nil or omitted, it kills the current
buffer.
Any processes that have this buffer as the process-buffer are
sent the SIGHUP (“hangup”) signal, which normally causes them
to terminate. See section Sending Signals to Processes.
If the buffer is visiting a file and contains unsaved changes,
kill-buffer asks the user to confirm before the buffer is killed.
It does this even if not called interactively. To prevent the request
for confirmation, clear the modified flag before calling
kill-buffer. See section Buffer Modification.
This function calls replace-buffer-in-windows for cleaning up
all windows currently displaying the buffer to be killed.
Killing a buffer that is already dead has no effect.
This function returns t if it actually killed the buffer. It
returns nil if the user refuses to confirm or if
buffer-or-name was already dead.
(kill-buffer "foo.unchanged")
⇒ t
(kill-buffer "foo.changed")
---------- Buffer: Minibuffer ----------
Buffer foo.changed modified; kill anyway? (yes or no) yes
---------- Buffer: Minibuffer ----------
⇒ t
Before confirming unsaved changes, kill-buffer calls the functions
in the list kill-buffer-query-functions, in order of appearance,
with no arguments. The buffer being killed is the current buffer when
they are called. The idea of this feature is that these functions will
ask for confirmation from the user. If any of them returns nil,
kill-buffer spares the buffer’s life.
This is a normal hook run by kill-buffer after asking all the
questions it is going to ask, just before actually killing the buffer.
The buffer to be killed is current when the hook functions run.
See section Hooks. This variable is a permanent local, so its local binding
is not cleared by changing major modes.
This variable, if non-nil in a particular buffer, tells
save-buffers-kill-emacs and save-some-buffers (if the
second optional argument to that function is t) to offer to
save that buffer, just as they offer to save file-visiting buffers.
See Definition of save-some-buffers. The variable
buffer-offer-save automatically becomes buffer-local when set
for any reason. See section Buffer-Local Variables.
This variable, if non-nil in a particular buffer, tells
save-buffers-kill-emacs and save-some-buffers to save
this buffer (if it’s modified) without asking the user. The variable
automatically becomes buffer-local when set for any reason.
This function returns t if object is a live buffer (a
buffer which has not been killed), nil otherwise.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
An indirect buffer shares the text of some other buffer, which is called the base buffer of the indirect buffer. In some ways it is the analogue, for buffers, of a symbolic link among files. The base buffer may not itself be an indirect buffer.
The text of the indirect buffer is always identical to the text of its base buffer; changes made by editing either one are visible immediately in the other. This includes the text properties as well as the characters themselves.
In all other respects, the indirect buffer and its base buffer are completely separate. They have different names, independent values of point, independent narrowing, independent markers and overlays (though inserting or deleting text in either buffer relocates the markers and overlays for both), independent major modes, and independent buffer-local variable bindings.
An indirect buffer cannot visit a file, but its base buffer can. If you try to save the indirect buffer, that actually saves the base buffer.
Killing an indirect buffer has no effect on its base buffer. Killing the base buffer effectively kills the indirect buffer in that it cannot ever again be the current buffer.
This creates and returns an indirect buffer named name whose base buffer is base-buffer. The argument base-buffer may be a live buffer or the name (a string) of an existing buffer. If name is the name of an existing buffer, an error is signaled.
If clone is non-nil, then the indirect buffer originally
shares the “state” of base-buffer such as major mode, minor
modes, buffer local variables and so on. If clone is omitted
or nil the indirect buffer’s state is set to the default state
for new buffers.
If base-buffer is an indirect buffer, its base buffer is used as
the base for the new buffer. If, in addition, clone is
non-nil, the initial state is copied from the actual base
buffer, not from base-buffer.
This function creates and returns a new indirect buffer that shares the current buffer’s base buffer and copies the rest of the current buffer’s attributes. (If the current buffer is not indirect, it is used as the base buffer.)
If display-flag is non-nil, that means to display the new
buffer by calling pop-to-buffer. If norecord is
non-nil, that means not to put the new buffer to the front of
the buffer list.
This function returns the base buffer of buffer, which defaults
to the current buffer. If buffer is not indirect, the value is
nil. Otherwise, the value is another buffer, which is never an
indirect buffer.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Specialized modes sometimes need to let the user access from the same buffer several vastly different types of text. For example, you may need to display a summary of the buffer text, in addition to letting the user access the text itself.
This could be implemented with multiple buffers (kept in sync when the user edits the text), or with narrowing (see section Narrowing). But these alternatives might sometimes become tedious or prohibitively expensive, especially if each type of text requires expensive buffer-global operations in order to provide correct display and editing commands.
Emacs provides another facility for such modes: you can quickly swap
buffer text between two buffers with buffer-swap-text. This
function is very fast because it doesn’t move any text, it only
changes the internal data structures of the buffer object to point to
a different chunk of text. Using it, you can pretend that a group of
two or more buffers are actually a single virtual buffer that holds
the contents of all the individual buffers together.
This function swaps the text of the current buffer and that of its argument buffer. It signals an error if one of the two buffers is an indirect buffer (see section Indirect Buffers) or is a base buffer of an indirect buffer.
All the buffer properties that are related to the buffer text are
swapped as well: the positions of point and mark, all the markers, the
overlays, the text properties, the undo list, the value of the
enable-multibyte-characters flag (see section enable-multibyte-characters), etc.
If you use buffer-swap-text on a file-visiting buffer, you
should set up a hook to save the buffer’s original text rather than
what it was swapped with. write-region-annotate-functions
works for this purpose. You should probably set
buffer-saved-size to -2 in the buffer, so that changes
in the text it is swapped with will not interfere with auto-saving.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs buffers are implemented using an invisible gap to make insertion and deletion faster. Insertion works by filling in part of the gap, and deletion adds to the gap. Of course, this means that the gap must first be moved to the locus of the insertion or deletion. Emacs moves the gap only when you try to insert or delete. This is why your first editing command in one part of a large buffer, after previously editing in another far-away part, sometimes involves a noticeable delay.
This mechanism works invisibly, and Lisp code should never be affected by the gap’s current location, but these functions are available for getting information about the gap status.
This function returns the current gap position in the current buffer.
This function returns the current gap size of the current buffer.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This chapter describes the functions and variables related to Emacs windows. See section Frames, for how windows are assigned an area of screen available for Emacs to use. See section Emacs Display, for information on how text is displayed in windows.
| 27.1 Basic Concepts of Emacs Windows | Basic information on using windows. | |
| 27.2 Windows and Frames | Relating windows to the frame they appear on. | |
| 27.3 Window Sizes | Accessing a window’s size. | |
| 27.4 Resizing Windows | Changing the sizes of windows. | |
| 27.5 Splitting Windows | Creating a new window. | |
| 27.6 Deleting Windows | Removing a window from its frame. | |
| 27.7 Recombining Windows | Preserving the frame layout when splitting and deleting windows. | |
| 27.8 Selecting Windows | The selected window is the one that you edit in. | |
| 27.9 Cyclic Ordering of Windows | Moving around the existing windows. | |
| 27.10 Buffers and Windows | Each window displays the contents of a buffer. | |
| 27.11 Switching to a Buffer in a Window | Higher-level functions for switching to a buffer. | |
| 27.12 Choosing a Window for Display | How to choose a window for displaying a buffer. | |
27.13 Action Functions for display-buffer | Subroutines for display-buffer.
| |
| 27.14 Additional Options for Displaying Buffers | Extra options affecting how buffers are displayed. | |
| 27.15 Window History | Each window remembers the buffers displayed in it. | |
| 27.16 Dedicated Windows | How to avoid displaying another buffer in a specific window. | |
| 27.17 Quitting Windows | How to restore the state prior to displaying a buffer. | |
| 27.18 Windows and Point | Each window has its own location of point. | |
| 27.19 The Window Start and End Positions | Buffer positions indicating which text is on-screen in a window. | |
| 27.20 Textual Scrolling | Moving text up and down through the window. | |
| 27.21 Vertical Fractional Scrolling | Moving the contents up and down on the window. | |
| 27.22 Horizontal Scrolling | Moving the contents sideways on the window. | |
| 27.23 Coordinates and Windows | Converting coordinates to windows. | |
| 27.24 Window Configurations | Saving and restoring the state of the screen. | |
| 27.25 Window Parameters | Associating additional information with windows. | |
| 27.26 Hooks for Window Scrolling and Changes | Hooks for scrolling, window size changes, redisplay going past a certain point, or window configuration changes. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A window is an area of the screen that is used to display a buffer (see section Buffers). In Emacs Lisp, windows are represented by a special Lisp object type.
Windows are grouped into frames (see section Frames). Each frame contains at least one window; the user can subdivide it into multiple, non-overlapping windows to view several buffers at once. Lisp programs can use multiple windows for a variety of purposes. In Rmail, for example, you can view a summary of message titles in one window, and the contents of the selected message in another window.
Emacs uses the word “window” with a different meaning than in graphical desktop environments and window systems, such as the X Window System. When Emacs is run on X, each of its graphical X windows is an Emacs frame (containing one or more Emacs windows). When Emacs is run on a text terminal, the frame fills the entire terminal screen.
Unlike X windows, Emacs windows are tiled; they never overlap within the area of the frame. When a window is created, resized, or deleted, the change in window space is taken from or given to the adjacent windows, so that the total area of the frame is unchanged.
This function returns t if object is a window (whether or
not it displays a buffer). Otherwise, it returns nil.
A live window is one that is actually displaying a buffer in a frame.
This function returns t if object is a live window and
nil otherwise. A live window is one that displays a buffer.
The windows in each frame are organized into a window tree. See section Windows and Frames. The leaf nodes of each window tree are live windows—the ones actually displaying buffers. The internal nodes of the window tree are internal windows, which are not live.
A valid window is one that is either live or internal. A valid window can be deleted, i.e., removed from its frame (see section Deleting Windows); then it is no longer valid, but the Lisp object representing it might be still referenced from other Lisp objects. A deleted window may be made valid again by restoring a saved window configuration (see section Window Configurations).
You can distinguish valid windows from deleted windows with
window-valid-p.
This function returns t if object is a live window, or an
internal window in a window tree. Otherwise, it returns nil,
including for the case where object is a deleted window.
In each frame, at any time, exactly one Emacs window is designated
as selected within the frame. For the selected frame, that
window is called the selected window—the one in which most
editing takes place, and in which the cursor for selected windows
appears (see section Cursor Parameters). The selected window’s buffer is
usually also the current buffer, except when set-buffer has
been used (see section The Current Buffer). As for non-selected frames, the
window selected within the frame becomes the selected window if the
frame is ever selected. See section Selecting Windows.
This function returns the selected window (which is always a live window).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Each window belongs to exactly one frame (see section Frames).
This function returns the frame that the window window belongs
to. If window is nil, it defaults to the selected
window.
This function returns a list of live windows belonging to the frame
frame. If frame is omitted or nil, it defaults to
the selected frame.
The optional argument minibuffer specifies whether to include
the minibuffer window in the returned list. If minibuffer is
t, the minibuffer window is included. If minibuffer is
nil or omitted, the minibuffer window is included only if it is
active. If minibuffer is neither nil nor t, the
minibuffer window is never included.
The optional argument window, if non-nil, should be a live
window on the specified frame; then window will be the first
element in the returned list. If window is omitted or nil,
the window selected within the frame is the first element.
Windows in the same frame are organized into a window tree, whose leaf nodes are the live windows. The internal nodes of a window tree are not live; they exist for the purpose of organizing the relationships between live windows. The root node of a window tree is called the root window. It can be either a live window (if the frame has just one window), or an internal window.
A minibuffer window (see section Minibuffer Windows) is not part of its
frame’s window tree unless the frame is a minibuffer-only frame.
Nonetheless, most of the functions in this section accept the
minibuffer window as an argument. Also, the function
window-tree described at the end of this section lists the
minibuffer window alongside the actual window tree.
This function returns the root window for frame-or-window. The
argument frame-or-window should be either a window or a frame;
if omitted or nil, it defaults to the selected frame. If
frame-or-window is a window, the return value is the root window
of that window’s frame.
When a window is split, there are two live windows where previously there was one. One of these is represented by the same Lisp window object as the original window, and the other is represented by a newly-created Lisp window object. Both of these live windows become leaf nodes of the window tree, as child windows of a single internal window. If necessary, Emacs automatically creates this internal window, which is also called the parent window, and assigns it to the appropriate position in the window tree. A set of windows that share the same parent are called siblings.
This function returns the parent window of window. If
window is omitted or nil, it defaults to the selected
window. The return value is nil if window has no parent
(i.e., it is a minibuffer window or the root window of its frame).
Each internal window always has at least two child windows. If this number falls to one as a result of window deletion, Emacs automatically deletes the internal window, and its sole remaining child window takes its place in the window tree.
Each child window can be either a live window, or an internal window (which in turn would have its own child windows). Therefore, each internal window can be thought of as occupying a certain rectangular screen area—the union of the areas occupied by the live windows that are ultimately descended from it.
For each internal window, the screen areas of the immediate children are arranged either vertically or horizontally (never both). If the child windows are arranged one above the other, they are said to form a vertical combination; if they are arranged side by side, they are said to form a horizontal combination. Consider the following example:
______________________________________
| ______ ____________________________ |
|| || __________________________ ||
|| ||| |||
|| ||| |||
|| ||| |||
|| |||____________W4____________|||
|| || __________________________ ||
|| ||| |||
|| ||| |||
|| |||____________W5____________|||
||__W2__||_____________W3_____________ |
|__________________W1__________________|
The root window of this frame is an internal window, W1. Its child windows form a horizontal combination, consisting of the live window W2 and the internal window W3. The child windows of W3 form a vertical combination, consisting of the live windows W4 and W5. Hence, the live windows in this window tree are W2, W4, and W5.
The following functions can be used to retrieve a child window of an internal window, and the siblings of a child window.
This function returns the topmost child window of window, if
window is an internal window whose children form a vertical
combination. For any other type of window, the return value is
nil.
This function returns the leftmost child window of window, if
window is an internal window whose children form a horizontal
combination. For any other type of window, the return value is
nil.
This function returns the first child window of the internal window
window—the topmost child window for a vertical combination, or
the leftmost child window for a horizontal combination. If
window is a live window, the return value is nil.
This function returns a non-nil value if and only if
window is part of a vertical combination. If window is
omitted or nil, it defaults to the selected one.
If the optional argument horizontal is non-nil, this
means to return non-nil if and only if window is part of
a horizontal combination.
This function returns the next sibling of the window window. If
omitted or nil, window defaults to the selected window.
The return value is nil if window is the last child of
its parent.
This function returns the previous sibling of the window window.
If omitted or nil, window defaults to the selected
window. The return value is nil if window is the first
child of its parent.
The functions window-next-sibling and
window-prev-sibling should not be confused with the functions
next-window and previous-window, which return the next
and previous window, respectively, in the cyclic ordering of windows
(see section Cyclic Ordering of Windows).
You can use the following functions to find the first live window on a frame and the window nearest to a given window.
This function returns the live window at the upper left corner of the
frame specified by frame-or-window. The argument
frame-or-window must denote a window or a live frame and defaults
to the selected frame. If frame-or-window specifies a window,
this function returns the first window on that window’s frame. Under
the assumption that the frame from our canonical example is selected
(frame-first-window) returns W2.
This function returns the nearest live window in direction
direction as seen from the position of window-point in
window window. The argument direction must be one of
above, below, left or right. The optional
argument window must denote a live window and defaults to the
selected one.
This function does not return a window whose no-other-window
parameter is non-nil (see section Window Parameters). If the nearest
window’s no-other-window parameter is non-nil, this
function tries to find another window in the indicated direction whose
no-other-window parameter is nil. If the optional
argument ignore is non-nil, a window may be returned even
if its no-other-window parameter is non-nil.
If the optional argument sign is a negative number, it means to
use the right or bottom edge of window as reference position
instead of window-point. If sign is a positive number, it
means to use the left or top edge of window as reference position.
If the optional argument wrap is non-nil, this means to
wrap direction around frame borders. For example, if window
is at the top of the frame and direction is above, then
return the minibuffer window provided the frame has one, and a window at
the bottom of the frame otherwise.
If the optional argument mini is nil, this means to return
the minibuffer window if and only if it is currently active. If
mini is non-nil, it returns the minibuffer window even when
it’s not active. However, if wrap non-nil, it always acts
as if mini were nil.
If it doesn’t find a suitable window, this function returns nil.
The following function allows to retrieve the entire window tree of a frame:
This function returns a list representing the window tree for frame
frame. If frame is omitted or nil, it defaults to
the selected frame.
The return value is a list of the form (root mini),
where root represents the window tree of the frame’s root
window, and mini is the frame’s minibuffer window.
If the root window is live, root is that window itself.
Otherwise, root is a list (dir edges w1
w2 ...) where dir is nil for a horizontal
combination and t for a vertical combination, edges gives
the size and position of the combination, and the remaining elements
are the child windows. Each child window may again be a window object
(for a live window) or a list with the same format as above (for an
internal window). The edges element is a list (left
top right bottom), similar to the value returned by
window-edges (see section Coordinates and Windows).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The following schematic shows the structure of a live window:
____________________________________________
|______________ Header Line ______________|RD| ^
^ |LS|LF|LM| |RM|RF|RS| | |
| | | | | | | | | | |
Window | | | | Text Area | | | | | Window
Body | | | | | (Window Body) | | | | | Total
Height | | | | | | | | | Height
| | | | |<- Window Body Width ->| | | | | |
v |__|__|__|_______________________|__|__|__| | |
|_______________ Mode Line _______________|__| |
|_____________ Bottom Divider _______________| v
<---------- Window Total Width ------------>
At the center of the window is the text area, or body, where the buffer text is displayed. The text area can be surrounded by a series of optional areas. On the left and right, from innermost to outermost, these are the left and right margins, denoted by LM and RM in the schematic (see section Displaying in the Margins); the left and right fringes, denoted by LF and RF (see section Fringes); the left or right scroll bar, only one of which is present at any time, denoted by LS and RS (see section Scroll Bars); and the right divider, denoted by RD (see section Window Dividers). At the top of the window is the header line (see section Window Header Lines); at the bottom of the window is the mode line (see section Mode Line Format) followed by the bottom divider (see section Window Dividers).
Emacs provides miscellaneous functions for finding the height and
width of a window. The return value of many of these functions can be
specified either in units of pixels or in units of lines and columns.
On a graphical display, the latter actually correspond to the height and
width of a “default” character specified by the frame’s default font
as returned by frame-char-height and frame-char-width
(see section Frame Size And Position). Thus, if a window is displaying text with
a different font or size, the reported line height and column width for
that window may differ from the actual number of text lines or columns
displayed within it.
The total height of a window is the number of lines comprising the window’s body, the header line, the mode line and the bottom divider (if any). Note that the height of a frame is not the same as the height of its root window (see section Windows and Frames), since a frame may also contain an echo area, a menu bar, and a tool bar (see section Frame Size And Position).
This function returns the total height, in lines, of the window
window. If window is omitted or nil, it defaults to
the selected window. If window is an internal window, the return
value is the total height occupied by its descendant windows.
If a window’s pixel height is not an integral multiple of its frame’s default character height, the number of lines occupied by the window is rounded internally. This is done in a way such that, if the window is a parent window, the sum of the total heights of all its child windows internally equals the total height of their parent. This means that although two windows have the same pixel height, their internal total heights may differ by one line. This means also, that if this window is vertically combined and has a right sibling, the topmost row of that sibling can be calculated as the sum of this window’s topmost row and total height (see section Coordinates and Windows)
If the optional argument round is ceiling, this
function returns the smallest integer larger than window’s pixel
height divided by the character height of its frame; if it is
floor, it returns the largest integer smaller than said value;
with any other round it returns the internal value of
windows’s total height.
The total width of a window is the number of lines comprising the window’s body, its margins, fringes, scroll bars and a right divider (if any).
This function returns the total width, in columns, of the window
window. If window is omitted or nil, it defaults to
the selected window. If window is internal, the return value is
the total width occupied by its descendant windows.
If a window’s pixel width is not an integral multiple of its frame’s
character width, the number of lines occupied by the window is rounded
internally. This is done in a way such that, if the window is a parent
window, the sum of the total widths of all its children internally
equals the total width of their parent. This means that although two
windows have the same pixel width, their internal total widths may
differ by one column. This means also, that if this window is
horizontally combined and has a right sibling, the leftmost column of
that sibling can be calculated as the sum of this window’s leftmost
column and total width (see section Coordinates and Windows). The
optional argument round behaves as it does for
window-total-height.
This function returns either the total height in lines or the total
width in columns of the window window. If horizontal is
omitted or nil, this is equivalent to calling
window-total-height for window; otherwise it is equivalent
to calling window-total-width for window. The optional
argument round behaves as it does for window-total-height.
The following two functions can be used to return the total size of a window in units of pixels.
This function returns the total height of window window in pixels. window must be a valid window and defaults to the selected one.
The return value includes mode and header line and a bottom divider, if any. If window is an internal window, its pixel height is the pixel height of the screen areas spanned by its children.
This function returns the width of window window in pixels. window must be a valid window and defaults to the selected one.
The return value includes the fringes and margins of window as well as any vertical dividers or scroll bars belonging to window. If window is an internal window, its pixel width is the width of the screen areas spanned by its children.
The following functions can be used to determine whether a given window has any adjacent windows.
This function returns non-nil if window has no other
window above or below it in its frame, i.e., its total height equals
the total height of the root window on that frame. If window is
omitted or nil, it defaults to the selected window.
This function returns non-nil if window has no other
window to the left or right in its frame, i.e., its total width equals
that of the root window on that frame. If window is omitted or
nil, it defaults to the selected window.
The body height of a window is the height of its text area, which does not include a mode or header line or a bottom divider.
This function returns the height, in lines, of the body of window
window. If window is omitted or nil, it defaults to
the selected window; otherwise it must be a live window.
If the optional argument pixelwise is non-nil, this
function returns the body height of window counted in pixels.
If pixelwise is nil, the return value is rounded down to
the nearest integer, if necessary. This means that if a line at the
bottom of the text area is only partially visible, that line is not
counted. It also means that the height of a window’s body can never
exceed its total height as returned by window-total-height.
The body width of a window is the width of its text area, which does not include the scroll bar, fringes, margins or a right divider.
This function returns the width, in columns, of the body of window
window. If window is omitted or nil, it defaults to
the selected window; otherwise it must be a live window.
If the optional argument pixelwise is non-nil, this
function returns the body width of window in units of pixels.
If pixelwise is nil, the return value is rounded down to
the nearest integer, if necessary. This means that if a column on the
right of the text area is only partially visible, that column is not
counted. It also means that the width of a window’s body can never
exceed its total width as returned by window-total-width.
This function returns the body height or body width of window. If
horizontal is omitted or nil, it is equivalent to calling
window-body-height for window; otherwise it is equivalent
to calling window-body-width. In either case, the optional
argument pixelwise is passed to the function called.
For compatibility with previous versions of Emacs,
window-height is an alias for window-total-height, and
window-width is an alias for window-body-width. These
aliases are considered obsolete and will be removed in the future.
The pixel heights of a window’s mode and header line can be retrieved with the functions given below. Their return value is usually accurate unless the window has not been displayed before: In that case, the return value is based on an estimate of the font used for the window’s frame.
This function returns the height in pixels of window’s mode line. window must be a live window and defaults to the selected one. If window has no mode line, the return value is zero.
This function returns the height in pixels of window’s header line. window must be a live window and defaults to the selected one. If window has no header line, the return value is zero.
Functions for retrieving the height and/or width of window dividers (see section Window Dividers), fringes (see section Fringes), scroll bars (see section Scroll Bars), and display margins (see section Displaying in the Margins) are described in the corresponding sections.
Commands that change the size of windows (see section Resizing Windows),
or split them (see section Splitting Windows), obey the variables
window-min-height and window-min-width, which specify the
smallest allowable window height and width. They also obey the variable
window-size-fixed, with which a window can be fixed in
size:
This option specifies the minimum total height, in lines, of any window. Its value has to accommodate at least one text line as well as a mode and header line and a bottom divider, if present.
This option specifies the minimum total width, in columns, of any window. Its value has to accommodate two text columns as well as margins, fringes, a scroll bar and a right divider, if present.
If this buffer-local variable is non-nil, the size of any
window displaying the buffer cannot normally be changed. Deleting a
window or changing the frame’s size may still change its size, if
there is no choice.
If the value is height, then only the window’s height is fixed;
if the value is width, then only the window’s width is fixed.
Any other non-nil value fixes both the width and the height.
If this variable is nil, this does not necessarily mean that any
window showing the buffer can be resized in the desired direction. To
determine that, use the function window-resizable.
See section Resizing Windows.
The following function tells how small a specific window can get taking
into account the sizes of its areas and the values of
window-min-height, window-min-width and
window-size-fixed.
This function returns the minimum size of window. window
must be a valid window and defaults to the selected one. The optional
argument horizontal non-nil means to return the minimum
number of columns of window; otherwise return the minimum number
of window’s lines.
The return value makes sure that all components of window remain
fully visible if window’s size were actually set to it. With
horizontal nil it includes the mode and header line and the
bottom divider. With horizontal non-nil it includes the
fringes, a scroll bar, and a right divider, if present. It does not,
however, include the space reserved for the margins.
The optional argument ignore, if non-nil, means ignore
restrictions imposed by fixed size windows, window-min-height or
window-min-width settings. If ignore equals safe,
live windows may get as small as window-safe-min-height lines and
window-safe-min-width columns. If ignore is a window,
ignore restrictions for that window only. Any other non-nil
value means ignore all of the above restrictions for all windows.
The optional argument pixelwise non-nil means to return the
minimum size of window counted in pixels.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes functions for resizing a window without changing the size of its frame. Because live windows do not overlap, these functions are meaningful only on frames that contain two or more windows: resizing a window also changes the size of a neighboring window. If there is just one window on a frame, its size cannot be changed except by resizing the frame (see section Frame Size And Position).
Except where noted, these functions also accept internal windows as arguments. Resizing an internal window causes its child windows to be resized to fit the same space.
This function returns delta if the size of window can be
changed vertically by delta lines. If the optional argument
horizontal is non-nil, it instead returns delta if
window can be resized horizontally by delta columns. It
does not actually change the window size.
If window is nil, it defaults to the selected window.
A positive value of delta means to check whether the window can be enlarged by that number of lines or columns; a negative value of delta means to check whether the window can be shrunk by that many lines or columns. If delta is non-zero, a return value of 0 means that the window cannot be resized.
Normally, the variables window-min-height and
window-min-width specify the smallest allowable window size
(see section Window Sizes). However, if the optional argument ignore
is non-nil, this function ignores window-min-height and
window-min-width, as well as window-size-fixed. Instead,
it considers the minimum-height window to be one consisting of a header,
a mode line and a bottom divider (if any), plus a text area one line
tall; and a minimum-width window as one consisting of fringes, margins,
a scroll bar and a right divider (if any), plus a text area two columns
wide.
If the optional argument pixelwise is non-nil,
delta is interpreted as pixels.
This function resizes window by delta increments. If
horizontal is nil, it changes the height by delta
lines; otherwise, it changes the width by delta columns. A
positive delta means to enlarge the window, and a negative
delta means to shrink it.
If window is nil, it defaults to the selected window. If
the window cannot be resized as demanded, an error is signaled.
The optional argument ignore has the same meaning as for the
function window-resizable above.
If the optional argument pixelwise is non-nil,
delta will be interpreted as pixels.
The choice of which window edges this function alters depends on the
values of the option window-combination-resize and the
combination limits of the involved windows; in some cases, it may alter
both edges. See section Recombining Windows. To resize by moving only the
bottom or right edge of a window, use the function
adjust-window-trailing-edge.
This function moves window’s bottom edge by delta lines.
If optional argument horizontal is non-nil, it instead
moves the right edge by delta columns. If window is
nil, it defaults to the selected window.
If the optional argument pixelwise is non-nil,
delta is interpreted as pixels.
A positive delta moves the edge downwards or to the right; a negative delta moves it upwards or to the left. If the edge cannot be moved as far as specified by delta, this function moves it as far as possible but does not signal a error.
This function tries to resize windows adjacent to the edge that is moved. If this is not possible for some reason (e.g., if that adjacent window is fixed-size), it may resize other windows.
If the value of this option is non-nil, Emacs resizes windows in
units of pixels. This currently affects functions like
split-window (see section Splitting Windows), maximize-window,
minimize-window, fit-window-to-buffer,
shrink-window-if-larger-than-buffer (all listed below) and
fit-frame-to-buffer (see section Frame Size And Position).
Note that when a frame’s pixel size is not a multiple of its character
size, at least one window may get resized pixelwise even if this
option is nil. The default value is nil.
The following commands resize windows in more specific ways. When called interactively, they act on the selected window.
This command adjusts the height or width of window to fit the text
in it. It returns non-nil if it was able to resize window,
and nil otherwise. If window is omitted or nil, it
defaults to the selected window. Otherwise, it should be a live window.
If window is part of a vertical combination, this function adjusts
window’s height. The new height is calculated from the actual
height of the accessible portion of its buffer. The optional argument
max-height, if non-nil, specifies the maximum total height
that this function can give window. The optional argument
min-height, if non-nil, specifies the minimum total height
that it can give, which overrides the variable window-min-height.
Both max-height and min-height are specified in lines and
include mode and header line and a bottom divider, if any.
If window is part of a horizontal combination and the value of the
option fit-window-to-buffer-horizontally (see below) is
non-nil, this function adjusts window’s height. The new
width of window is calculated from the maximum length of its
buffer’s lines that follow the current start position of window.
The optional argument max-width specifies a maximum width and
defaults to the width of window’s frame. The optional argument
min-width specifies a minimum width and defaults to
window-min-width. Both max-width and min-width are
specified in columns and include fringes, margins and scrollbars, if
any.
If the option fit-frame-to-buffer (see below) is non-nil,
this function will try to resize the frame of window to fit its
contents by calling fit-frame-to-buffer (see section Frame Size And Position).
If this is non-nil, fit-window-to-buffer can resize
windows horizontally. If this is nil (the default)
fit-window-to-buffer never resizes windows horizontally. If this
is only, it can resize windows horizontally only. Any other
value means fit-window-to-buffer can resize windows in both
dimensions.
If this option is non-nil, fit-window-to-buffer can fit a
frame to its buffer. A frame is fit if and only if its root window is a
live window and this option is non-nil. If this is
horizontally, frames are fit horizontally only. If this is
vertically, frames are fit vertically only. Any other
non-nil value means frames can be resized in both dimensions.
This command attempts to reduce window’s height as much as
possible while still showing its full buffer, but no less than
window-min-height lines. The return value is non-nil if
the window was resized, and nil otherwise. If window is
omitted or nil, it defaults to the selected window. Otherwise,
it should be a live window.
This command does nothing if the window is already too short to display all of its buffer, or if any of the buffer is scrolled off-screen, or if the window is the only live window in its frame.
This command calls fit-window-to-buffer (see above) to do its
work.
This function balances windows in a way that gives more space to full-width and/or full-height windows. If window-or-frame specifies a frame, it balances all windows on that frame. If window-or-frame specifies a window, it balances only that window and its siblings (see section Windows and Frames).
This function attempts to give all windows on the selected frame approximately the same share of the screen area. Full-width or full-height windows are not given more space than other windows.
This function attempts to make window as large as possible, in
both dimensions, without resizing its frame or deleting other windows.
If window is omitted or nil, it defaults to the selected
window.
This function attempts to make window as small as possible, in
both dimensions, without deleting it or resizing its frame. If
window is omitted or nil, it defaults to the selected
window.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes functions for creating a new window by splitting an existing one.
This function creates a new live window next to the window
window. If window is omitted or nil, it defaults
to the selected window. That window is “split”, and reduced in
size. The space is taken up by the new window, which is returned.
The optional second argument size determines the sizes of
window and/or the new window. If it is omitted or nil,
both windows are given equal sizes; if there is an odd line, it is
allocated to the new window. If size is a positive number,
window is given size lines (or columns, depending on the
value of side). If size is a negative number, the new
window is given -size lines (or columns).
If size is nil, this function obeys the variables
window-min-height and window-min-width (see section Window Sizes). Thus, it signals an error if splitting would result in making
a window smaller than those variables specify. However, a
non-nil value for size causes those variables to be
ignored; in that case, the smallest allowable window is considered to be
one that has space for a text area one line tall and/or two columns
wide.
Hence, if size is specified, it’s the caller’s responsibility to
check whether the emanating windows are large enough to encompass all
areas like a mode line or a scroll bar. The function
window-min-size (see section Window Sizes) can be used to determine
the minimum requirements of window in this regard. Since the new
window usually “inherits” areas like the mode line or the scroll bar
from window, that function is also a good guess for the minimum
size of the new window. The caller should specify a smaller size only
if it correspondingly removes an inherited area before the next
redisplay.
The optional third argument side determines the position of the
new window relative to window. If it is nil or
below, the new window is placed below window. If it is
above, the new window is placed above window. In both
these cases, size specifies a total window height, in lines.
If side is t or right, the new window is placed on
the right of window. If side is left, the new
window is placed on the left of window. In both these cases,
size specifies a total window width, in columns.
The optional fourth argument pixelwise, if non-nil, means
to interpret size in units of pixels, instead of lines and
columns.
If window is a live window, the new window inherits various properties from it, including margins and scroll bars. If window is an internal window, the new window inherits the properties of the window selected within window’s frame.
The behavior of this function may be altered by the window parameters
of window, so long as the variable
ignore-window-parameters is nil. If the value of
the split-window window parameter is t, this function
ignores all other window parameters. Otherwise, if the value of the
split-window window parameter is a function, that function is
called with the arguments window, size, and side, in
lieu of the usual action of split-window. Otherwise, this
function obeys the window-atom or window-side window
parameter, if any. See section Window Parameters.
As an example, here is a sequence of split-window calls that
yields the window configuration discussed in Windows and Frames.
This example demonstrates splitting a live window as well as splitting
an internal window. We begin with a frame containing a single window
(a live root window), which we denote by W4. Calling
(split-window W4) yields this window configuration:
______________________________________
| ____________________________________ |
|| ||
|| ||
|| ||
||_________________W4_________________||
| ____________________________________ |
|| ||
|| ||
|| ||
||_________________W5_________________||
|__________________W3__________________|
The split-window call has created a new live window, denoted by
W5. It has also created a new internal window, denoted by
W3, which becomes the root window and the parent of both
W4 and W5.
Next, we call (split-window W3 nil 'left), passing the
internal window W3 as the argument. The result:
______________________________________
| ______ ____________________________ |
|| || __________________________ ||
|| ||| |||
|| ||| |||
|| ||| |||
|| |||____________W4____________|||
|| || __________________________ ||
|| ||| |||
|| ||| |||
|| |||____________W5____________|||
||__W2__||_____________W3_____________ |
|__________________W1__________________|
A new live window W2 is created, to the left of the internal window W3. A new internal window W1 is created, becoming the new root window.
For interactive use, Emacs provides two commands which always split
the selected window. These call split-window internally.
This function splits the selected window into two side-by-side windows, putting the selected window on the left. If size is positive, the left window gets size columns; if size is negative, the right window gets -size columns.
This function splits the selected window into two windows, one above the other, leaving the upper window selected. If size is positive, the upper window gets size lines; if size is negative, the lower window gets -size lines.
If the value of this variable is non-nil (the default),
split-window-below behaves as described above.
If it is nil, split-window-below adjusts point in each
of the two windows to minimize redisplay. (This is useful on slow
terminals.) It selects whichever window contains the screen line that
point was previously on. Note that this only affects
split-window-below, not the lower-level split-window
function.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Deleting a window removes it from the frame’s window tree. If the window is a live window, it disappears from the screen. If the window is an internal window, its child windows are deleted too.
Even after a window is deleted, it continues to exist as a Lisp object, until there are no more references to it. Window deletion can be reversed, by restoring a saved window configuration (see section Window Configurations).
This function removes window from display and returns
nil. If window is omitted or nil, it defaults to
the selected window. If deleting the window would leave no more
windows in the window tree (e.g., if it is the only live window in the
frame), an error is signaled.
By default, the space taken up by window is given to one of its
adjacent sibling windows, if any. However, if the variable
window-combination-resize is non-nil, the space is
proportionally distributed among any remaining windows in the window
combination. See section Recombining Windows.
The behavior of this function may be altered by the window parameters
of window, so long as the variable
ignore-window-parameters is nil. If the value of
the delete-window window parameter is t, this function
ignores all other window parameters. Otherwise, if the value of the
delete-window window parameter is a function, that function is
called with the argument window, in lieu of the usual action of
delete-window. Otherwise, this function obeys the
window-atom or window-side window parameter, if any.
See section Window Parameters.
This function makes window fill its frame, by deleting other
windows as necessary. If window is omitted or nil, it
defaults to the selected window. The return value is nil.
The behavior of this function may be altered by the window parameters
of window, so long as the variable
ignore-window-parameters is nil. If the value of
the delete-other-windows window parameter is t, this
function ignores all other window parameters. Otherwise, if the value
of the delete-other-windows window parameter is a function,
that function is called with the argument window, in lieu of the
usual action of delete-other-windows. Otherwise, this function
obeys the window-atom or window-side window parameter,
if any. See section Window Parameters.
This function deletes all windows showing buffer-or-name, by
calling delete-window on those windows. buffer-or-name
should be a buffer, or the name of a buffer; if omitted or nil,
it defaults to the current buffer. If there are no windows showing
the specified buffer, this function does nothing. If the specified
buffer is a minibuffer, an error is signaled.
If there is a dedicated window showing the buffer, and that window is the only one on its frame, this function also deletes that frame if it is not the only frame on the terminal.
The optional argument frame specifies which frames to operate on:
nil
means operate on all frames.
t
means operate on the selected frame.
visible
means operate on all visible frames.
0
means operate on all visible or iconified frames.
Note that this argument does not have the same meaning as in other
functions which scan all live windows (see section Cyclic Ordering of Windows). Specifically, the meanings of t and nil here
are the opposite of what they are in those other functions.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When deleting the last sibling of a window W, its parent window is deleted too, with W replacing it in the window tree. This means that W must be recombined with its parent’s siblings to form a new window combination (see section Windows and Frames). In some occasions, deleting a live window may even entail the deletion of two internal windows.
______________________________________
| ______ ____________________________ |
|| || __________________________ ||
|| ||| ___________ ___________ |||
|| |||| || ||||
|| ||||____W6_____||_____W7____||||
|| |||____________W4____________|||
|| || __________________________ ||
|| ||| |||
|| ||| |||
|| |||____________W5____________|||
||__W2__||_____________W3_____________ |
|__________________W1__________________|
Deleting W5 in this configuration normally causes the deletion of W3 and W4. The remaining live windows W2, W6 and W7 are recombined to form a new horizontal combination with parent W1.
Sometimes, however, it makes sense to not delete a parent window like W4. In particular, a parent window should not be removed when it was used to preserve a combination embedded in a combination of the same type. Such embeddings make sense to assure that when you split a window and subsequently delete the new window, Emacs reestablishes the layout of the associated frame as it existed before the splitting.
Consider a scenario starting with two live windows W2 and W3 and their parent W1.
______________________________________
| ____________________________________ |
|| ||
|| ||
|| ||
|| ||
|| ||
|| ||
||_________________W2_________________||
| ____________________________________ |
|| ||
|| ||
||_________________W3_________________||
|__________________W1__________________|
Split W2 to make a new window W4 as follows.
______________________________________
| ____________________________________ |
|| ||
|| ||
||_________________W2_________________||
| ____________________________________ |
|| ||
|| ||
||_________________W4_________________||
| ____________________________________ |
|| ||
|| ||
||_________________W3_________________||
|__________________W1__________________|
Now, when enlarging a window vertically, Emacs tries to obtain the corresponding space from its lower sibling, provided such a window exists. In our scenario, enlarging W4 will steal space from W3.
______________________________________
| ____________________________________ |
|| ||
|| ||
||_________________W2_________________||
| ____________________________________ |
|| ||
|| ||
|| ||
|| ||
||_________________W4_________________||
| ____________________________________ |
||_________________W3_________________||
|__________________W1__________________|
Deleting W4 will now give its entire space to W2, including the space earlier stolen from W3.
______________________________________
| ____________________________________ |
|| ||
|| ||
|| ||
|| ||
|| ||
|| ||
|| ||
|| ||
||_________________W2_________________||
| ____________________________________ |
||_________________W3_________________||
|__________________W1__________________|
This can be counterintuitive, in particular if W4 were used for displaying a buffer only temporarily (see section Temporary Displays), and you want to continue working with the initial layout.
The behavior can be fixed by making a new parent window when splitting W2. The variable described next allows to do that.
This variable controls whether splitting a window shall make a new parent window. The following values are recognized:
nilThis means that the new live window is allowed to share the existing parent window, if one exists, provided the split occurs in the same direction as the existing window combination (otherwise, a new internal window is created anyway).
window-sizeIn this case display-buffer makes a new parent window if it is
passed a window-height or window-width entry in the
alist argument (see section Action Functions for display-buffer).
temp-bufferThis value causes the creation of a new parent window when a window is split for showing a temporary buffer (see section Temporary Displays) only.
display-bufferThis means that when display-buffer (see section Choosing a Window for Display)
splits a window it always makes a new parent window.
tIn this case a new parent window is always created when splitting a
window. Thus, if the value of this variable is at all times t,
then at all times every window tree is a binary tree (a tree where each
window except the root window has exactly one sibling).
The default is nil. Other values are reserved for future use.
If, as a consequence of this variable’s setting, split-window
makes a new parent window, it also calls
set-window-combination-limit (see below) on the newly-created
internal window. This affects how the window tree is rearranged when
the child windows are deleted (see below).
If window-combination-limit is t, splitting W2 in
the initial configuration of our scenario would have produced this:
______________________________________
| ____________________________________ |
|| __________________________________ ||
||| |||
|||________________W2________________|||
|| __________________________________ ||
||| |||
|||________________W4________________|||
||_________________W5_________________||
| ____________________________________ |
|| ||
|| ||
||_________________W3_________________||
|__________________W1__________________|
A new internal window W5 has been created; its children are W2 and the new live window W4. Now, W2 is the only sibling of W4, so enlarging W4 will try to shrink W2, leaving W3 unaffected. Observe that W5 represents a vertical combination of two windows embedded in the vertical combination W1.
This function sets the combination limit of the window
window to limit. This value can be retrieved via the
function window-combination-limit. See below for its effects;
note that it is only meaningful for internal windows. The
split-window function automatically calls this function, passing
it t as limit, provided the value of the variable
window-combination-limit is t when it is called.
This function returns the combination limit for window.
The combination limit is meaningful only for an internal window. If it
is nil, then Emacs is allowed to automatically delete
window, in response to a window deletion, in order to group the
child windows of window with its sibling windows to form a new
window combination. If the combination limit is t, the child
windows of window are never automatically recombined with its
siblings.
If, in the configuration shown at the beginning of this section, the
combination limit of W4 (the parent window of W6 and
W7) is t, deleting W5 will not implicitly delete
W4 too.
Alternatively, the problems sketched above can be avoided by always resizing all windows in the same combination whenever one of its windows is split or deleted. This also permits to split windows that would be otherwise too small for such an operation.
If this variable is nil, split-window can only split a
window (denoted by window) if window’s screen area is large
enough to accommodate both itself and the new window.
If this variable is t, split-window tries to resize all
windows that are part of the same combination as window, in order
to accommodate the new window. In particular, this may allow
split-window to succeed even if window is a fixed-size
window or too small to ordinarily split. Furthermore, subsequently
resizing or deleting window may resize all other windows in its
combination.
The default is nil. Other values are reserved for future use.
The value of this variable is ignored when
window-combination-limit is non-nil.
To illustrate the effect of window-combination-resize, consider
the following frame layout.
______________________________________
| ____________________________________ |
|| ||
|| ||
|| ||
|| ||
||_________________W2_________________||
| ____________________________________ |
|| ||
|| ||
|| ||
|| ||
||_________________W3_________________||
|__________________W1__________________|
If window-combination-resize is nil, splitting window
W3 leaves the size of W2 unchanged:
______________________________________
| ____________________________________ |
|| ||
|| ||
|| ||
|| ||
||_________________W2_________________||
| ____________________________________ |
|| ||
||_________________W3_________________||
| ____________________________________ |
|| ||
||_________________W4_________________||
|__________________W1__________________|
If window-combination-resize is t, splitting W3
instead leaves all three live windows with approximately the same
height:
______________________________________
| ____________________________________ |
|| ||
|| ||
||_________________W2_________________||
| ____________________________________ |
|| ||
|| ||
||_________________W3_________________||
| ____________________________________ |
|| ||
|| ||
||_________________W4_________________||
|__________________W1__________________|
Deleting any of the live windows W2, W3 or W4 will distribute its space proportionally among the two remaining live windows.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This function makes window the selected window and the window
selected within its frame (see section Basic Concepts of Emacs Windows) and selects that
frame. It also makes window’s buffer (see section Buffers and Windows) current and sets that buffer’s value of point to the
value of window-point (see section Windows and Point) in window.
window must be a live window. The return value is window.
By default, this function also moves window’s buffer to the front
of the buffer list (see section The Buffer List), and makes window the
most recently selected window. However, if the optional argument
norecord is non-nil, these additional actions are omitted.
This function runs buffer-list-update-hook (see section The Buffer List)
unless norecord is non-nil. Note that applications and
internal routines often temporarily select a window in order to simplify
coding. As a rule, such selections (including those made by the macros
save-selected-window and with-selected-window below) are
not recorded thus avoiding to pollute buffer-list-update-hook.
Selections that “really count” are those causing a visible change in
the next redisplay of window’s frame and should be always
recorded. This also means that to run a function each time a window
gets selected, putting it on buffer-list-update-hook should be
the right choice.
The sequence of calls to select-window with a non-nil
norecord argument determines an ordering of windows by their
selection time. The function get-lru-window can be used to
retrieve the least recently selected live window (see section Cyclic Ordering of Windows).
This macro records the selected frame, as well as the selected window of each frame, executes forms in sequence, then restores the earlier selected frame and windows. It also saves and restores the current buffer. It returns the value of the last form in forms.
This macro does not save or restore anything about the sizes, arrangement or contents of windows; therefore, if forms change them, the change persists. If the previously selected window of some frame is no longer live at the time of exit from forms, that frame’s selected window is left alone. If the previously selected window is no longer live, then whatever window is selected at the end of forms remains selected. The current buffer is restored if and only if it is still live when exiting forms.
This macro changes neither the ordering of recently selected windows nor the buffer list.
This macro selects window, executes forms in sequence, then
restores the previously selected window and current buffer. The ordering
of recently selected windows and the buffer list remain unchanged unless
you deliberately change them within forms; for example, by calling
select-window with argument norecord nil.
This macro does not change the order of recently selected windows or the buffer list.
This function returns the window on frame that is selected
within that frame. frame should be a live frame; if omitted or
nil, it defaults to the selected frame.
This function makes window the window selected within the frame
frame. frame should be a live frame; if nil, it
defaults to the selected frame. window should be a live window;
if nil, it defaults to the selected window.
If frame is the selected frame, this makes window the selected window.
If the optional argument norecord is non-nil, this
function does not alter the list of most recently selected windows,
nor the buffer list.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When you use the command C-x o (other-window) to select
some other window, it moves through live windows in a specific order.
For any given configuration of windows, this order never varies. It
is called the cyclic ordering of windows.
The ordering is determined by a depth-first traversal of the frame’s window tree, retrieving the live windows which are the leaf nodes of the tree (see section Windows and Frames). If the minibuffer is active, the minibuffer window is included too. The ordering is cyclic, so the last window in the sequence is followed by the first one.
This function returns a live window, the one following window in
the cyclic ordering of windows. window should be a live window;
if omitted or nil, it defaults to the selected window.
The optional argument minibuf specifies whether minibuffer windows
should be included in the cyclic ordering. Normally, when minibuf
is nil, a minibuffer window is included only if it is currently
“active”; this matches the behavior of C-x o. (Note that a
minibuffer window is active as long as its minibuffer is in use; see
Minibuffers).
If minibuf is t, the cyclic ordering includes all
minibuffer windows. If minibuf is neither t nor
nil, minibuffer windows are not included even if they are active.
The optional argument all-frames specifies which frames to consider:
nil
means to consider windows on window’s frame. If the minibuffer
window is considered (as specified by the minibuf argument),
then frames that share the minibuffer window are considered too.
t
means to consider windows on all existing frames.
visible
means to consider windows on all visible frames.
If more than one frame is considered, the cyclic ordering is obtained by appending the orderings for those frames, in the same order as the list of all live frames (see section Finding All Frames).
This function returns a live window, the one preceding window in
the cyclic ordering of windows. The other arguments are handled like
in next-window.
This function selects a live window, one count places from the selected window in the cyclic ordering of windows. If count is a positive number, it skips count windows forwards; if count is negative, it skips -count windows backwards; if count is zero, that simply re-selects the selected window. When called interactively, count is the numeric prefix argument.
The optional argument all-frames has the same meaning as in
next-window, like a nil minibuf argument to
next-window.
This function does not select a window that has a non-nil
no-other-window window parameter (see section Window Parameters).
This function calls the function fun once for each live window, with the window as the argument.
It follows the cyclic ordering of windows. The optional arguments
minibuf and all-frames specify the set of windows
included; these have the same arguments as in next-window. If
all-frames specifies a frame, the first window walked is the
first window on that frame (the one returned by
frame-first-window), not necessarily the selected window.
If fun changes the window configuration by splitting or deleting windows, that does not alter the set of windows walked, which is determined prior to calling fun for the first time.
This function returns t if the selected window is the only live
window, and nil otherwise.
If the minibuffer window is active, it is normally considered (so that
this function returns nil). However, if the optional argument
no-mini is non-nil, the minibuffer window is ignored even
if active. The optional argument all-frames has the same
meaning as for next-window.
The following functions return a window which satisfies some criterion, without selecting it:
This function returns a live window which is heuristically the “least
recently used” window. The optional argument all-frames has
the same meaning as in next-window.
If any full-width windows are present, only those windows are
considered. A minibuffer window is never a candidate. A dedicated
window (see section Dedicated Windows) is never a candidate unless the
optional argument dedicated is non-nil. The selected
window is never returned, unless it is the only candidate. However, if
the optional argument not-selected is non-nil, this
function returns nil in that case.
This function returns the window with the largest area (height times
width). The optional argument all-frames specifies the windows to
search, and has the same meaning as in next-window.
A minibuffer window is never a candidate. A dedicated window
(see section Dedicated Windows) is never a candidate unless the optional
argument dedicated is non-nil. The selected window is not
a candidate if the optional argument not-selected is
non-nil. If the optional argument not-selected is
non-nil and the selected window is the only candidate, this
function returns nil.
If there are two candidate windows of the same size, this function prefers the one that comes first in the cyclic ordering of windows, starting from the selected window.
This function calls the function predicate for each of the
windows in the cyclic order of windows in turn, passing it the window
as an argument. If the predicate returns non-nil for any
window, this function stops and returns that window. If no such
window is found, the return value is default (which defaults to
nil).
The optional arguments minibuf and all-frames specify the
windows to search, and have the same meanings as in
next-window.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes low-level functions for examining and setting the contents of windows. See section Switching to a Buffer in a Window, for higher-level functions for displaying a specific buffer in a window.
This function returns the buffer that window is displaying. If
window is omitted or nil it defaults to the selected
window. If window is an internal window, this function returns
nil.
This function makes window display buffer-or-name.
window should be a live window; if nil, it defaults to
the selected window. buffer-or-name should be a buffer, or the
name of an existing buffer. This function does not change which
window is selected, nor does it directly change which buffer is
current (see section The Current Buffer). Its return value is nil.
If window is strongly dedicated to a buffer and buffer-or-name does not specify that buffer, this function signals an error. See section Dedicated Windows.
By default, this function resets window’s position, display
margins, fringe widths, and scroll bar settings, based on the local
variables in the specified buffer. However, if the optional argument
keep-margins is non-nil, it leaves the display margins
and fringe widths unchanged.
When writing an application, you should normally use the higher-level
functions described in Switching to a Buffer in a Window, instead of calling
set-window-buffer directly.
This runs window-scroll-functions, followed by
window-configuration-change-hook. See section Hooks for Window Scrolling and Changes.
This buffer-local variable records the number of times a buffer has been
displayed in a window. It is incremented each time
set-window-buffer is called for the buffer.
This buffer-local variable records the time at which a buffer was last
displayed in a window. The value is nil if the buffer has
never been displayed. It is updated each time
set-window-buffer is called for the buffer, with the value
returned by current-time (see section Time of Day).
This function returns the first window displaying buffer-or-name
in the cyclic ordering of windows, starting from the selected window
(see section Cyclic Ordering of Windows). If no such window exists, the
return value is nil.
buffer-or-name should be a buffer or the name of a buffer; if
omitted or nil, it defaults to the current buffer. The
optional argument all-frames specifies which windows to
consider:
t means consider windows on all existing frames.
visible means consider windows on all visible frames.
Note that these meanings differ slightly from those of the
all-frames argument to next-window (see section Cyclic Ordering of Windows). This function may be changed in a future version of Emacs
to eliminate this discrepancy.
This function returns a list of all windows currently displaying
buffer-or-name. buffer-or-name should be a buffer or the
name of an existing buffer. If omitted or nil, it defaults to
the current buffer.
The arguments minibuf and all-frames have the same
meanings as in the function next-window (see section Cyclic Ordering of Windows). Note that the all-frames argument does not
behave exactly like in get-buffer-window.
This command replaces buffer-or-name with some other buffer, in
all windows displaying it. buffer-or-name should be a buffer, or
the name of an existing buffer; if omitted or nil, it defaults to
the current buffer.
The replacement buffer in each window is chosen via
switch-to-prev-buffer (see section Window History). Any dedicated
window displaying buffer-or-name is deleted if possible
(see section Dedicated Windows). If such a window is the only window on its
frame and there are other frames on the same terminal, the frame is
deleted as well. If the dedicated window is the only window on the only
frame on its terminal, the buffer is replaced anyway.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes high-level functions for switching to a specified buffer in some window. In general, “switching to a buffer” means to (1) show the buffer in some window, (2) make that window the selected window (and its frame the selected frame), and (3) make the buffer the current buffer.
Do not use these functions to make a buffer temporarily
current just so a Lisp program can access or modify it. They have
side-effects, such as changing window histories (see section Window History), which will surprise the user if used that way. If you want
to make a buffer current to modify it in Lisp, use
with-current-buffer, save-current-buffer, or
set-buffer. See section The Current Buffer.
This command attempts to display buffer-or-name in the selected window and make it the current buffer. It is often used interactively (as the binding of C-x b), as well as in Lisp programs. The return value is the buffer switched to.
If buffer-or-name is nil, it defaults to the buffer
returned by other-buffer (see section The Buffer List). If
buffer-or-name is a string that is not the name of any existing
buffer, this function creates a new buffer with that name; the new
buffer’s major mode is determined by the variable major-mode
(see section Major Modes).
Normally, the specified buffer is put at the front of the buffer
list—both the global buffer list and the selected frame’s buffer
list (see section The Buffer List). However, this is not done if the
optional argument norecord is non-nil.
Sometimes, switch-to-buffer may be unable to display the buffer
in the selected window. This happens if the selected window is a
minibuffer window, or if the selected window is strongly dedicated to
its buffer (see section Dedicated Windows). In that case, the command
normally tries to display the buffer in some other window, by invoking
pop-to-buffer (see below). However, if the optional argument
force-same-window is non-nil, it signals an error
instead.
By default, switch-to-buffer shows the buffer at its position of
point. This behavior can be tuned using the following option.
If this variable is nil, switch-to-buffer displays the
buffer specified by buffer-or-name at the position of that
buffer’s point. If this variable is already-displayed, it
tries to display the buffer at its previous position in the selected
window, provided the buffer is currently displayed in some other window
on any visible or iconified frame. If this variable is t,
switch-to-buffer unconditionally tries to display the buffer at
its previous position in the selected window.
This variable is ignored if the buffer is already displayed in the
selected window or never appeared in it before, or if
switch-to-buffer calls pop-to-buffer to display the
buffer.
The next two commands are similar to switch-to-buffer, except for
the described features.
This function displays the buffer specified by buffer-or-name in
some window other than the selected window. It uses the function
pop-to-buffer internally (see below).
If the selected window already displays the specified buffer, it continues to do so, but another window is nonetheless found to display it as well.
The buffer-or-name and norecord arguments have the same
meanings as in switch-to-buffer.
This function displays the buffer specified by buffer-or-name in a
new frame. It uses the function pop-to-buffer internally (see
below).
If the specified buffer is already displayed in another window, in any frame on the current terminal, this switches to that window instead of creating a new frame. However, the selected window is never used for this.
The buffer-or-name and norecord arguments have the same
meanings as in switch-to-buffer.
The above commands use the function pop-to-buffer, which
flexibly displays a buffer in some window and selects that window for
editing. In turn, pop-to-buffer uses display-buffer for
displaying the buffer. Hence, all the variables affecting
display-buffer will affect it as well. See section Choosing a Window for Display,
for the documentation of display-buffer.
This function makes buffer-or-name the current buffer and displays it in some window, preferably not the window previously selected. It then selects the displaying window. If that window is on a different graphical frame, that frame is given input focus if possible (see section Input Focus). The return value is the buffer that was switched to.
If buffer-or-name is nil, it defaults to the buffer
returned by other-buffer (see section The Buffer List). If
buffer-or-name is a string that is not the name of any existing
buffer, this function creates a new buffer with that name; the new
buffer’s major mode is determined by the variable major-mode
(see section Major Modes).
If action is non-nil, it should be a display action to
pass to display-buffer (see section Choosing a Window for Display).
Alternatively, a non-nil, non-list value means to pop to a
window other than the selected one—even if the buffer is already
displayed in the selected window.
Like switch-to-buffer, this function updates the buffer list
unless norecord is non-nil.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The command display-buffer flexibly chooses a window for
display, and displays a specified buffer in that window. It can be
called interactively, via the key binding C-x 4 C-o. It is also
used as a subroutine by many functions and commands, including
switch-to-buffer and pop-to-buffer (see section Switching to a Buffer in a Window).
This command performs several complex steps to find a window to
display in. These steps are described by means of display
actions, which have the form (function . alist).
Here, function is either a function or a list of functions,
which we refer to as action functions; alist is an
association list, which we refer to as action alists.
An action function accepts two arguments: the buffer to display and
an action alist. It attempts to display the buffer in some window,
picking or creating a window according to its own criteria. If
successful, it returns the window; otherwise, it returns nil.
See section Action Functions for display-buffer, for a list of predefined action
functions.
display-buffer works by combining display actions from
several sources, and calling the action functions in turn, until one
of them manages to display the buffer and returns a non-nil
value.
This command makes buffer-or-name appear in some window, without selecting the window or making the buffer current. The argument buffer-or-name must be a buffer or the name of an existing buffer. The return value is the window chosen to display the buffer.
The optional argument action, if non-nil, should normally
be a display action (described above). display-buffer builds a
list of action functions and an action alist, by consolidating display
actions from the following sources (in order):
display-buffer-overriding-action.
display-buffer-alist.
display-buffer-base-action.
display-buffer-fallback-action.
Each action function is called in turn, passing the buffer as the
first argument and the combined action alist as the second argument,
until one of the functions returns non-nil. The caller can
pass (allow-no-window . t) as an element of the action alist to
indicate its readiness to handle the case of not displaying the
buffer in a window.
The argument action can also have a non-nil, non-list
value. This has the special meaning that the buffer should be
displayed in a window other than the selected one, even if the
selected window is already displaying it. If called interactively
with a prefix argument, action is t.
The optional argument frame, if non-nil, specifies which
frames to check when deciding whether the buffer is already displayed.
It is equivalent to adding an element (reusable-frames
. frame) to the action alist of action. See section Action Functions for display-buffer.
The value of this variable should be a display action, which is
treated with the highest priority by display-buffer. The
default value is empty, i.e., (nil . nil).
The value of this option is an alist mapping conditions to display
actions. Each condition may be either a regular expression matching a
buffer name or a function that takes two arguments: a buffer name and
the action argument passed to display-buffer. If the name
of the buffer passed to display-buffer either matches a regular
expression in this alist or the function specified by a condition
returns non-nil, then display-buffer uses the
corresponding display action to display the buffer.
The value of this option should be a display action. This option can
be used to define a “standard” display action for calls to
display-buffer.
This display action specifies the fallback behavior for
display-buffer if no other display actions are given.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
display-bufferThe following basic action functions are defined in Emacs. Each of
these functions takes two arguments: buffer, the buffer to
display, and alist, an action alist. Each action function
returns the window if it succeeds, and nil if it fails.
This function tries to display buffer in the selected window.
It fails if the selected window is a minibuffer window or is dedicated
to another buffer (see section Dedicated Windows). It also fails if
alist has a non-nil inhibit-same-window entry.
This function tries to “display” buffer by finding a window that is already displaying it.
If alist has a non-nil inhibit-same-window entry,
the selected window is not eligible for reuse. If alist
contains a reusable-frames entry, its value determines which
frames to search for a reusable window:
nil means consider windows on the selected frame.
(Actually, the last non-minibuffer frame.)
t means consider windows on all frames.
visible means consider windows on all visible frames.
Note that these meanings differ slightly from those of the
all-frames argument to next-window (see section Cyclic Ordering of Windows).
If alist contains no reusable-frames entry, this function
normally searches just the selected frame; however, if the variable
pop-up-frames is non-nil, it searches all frames on the
current terminal. See section Additional Options for Displaying Buffers.
If this function chooses a window on another frame, it makes that frame
visible and, unless alist contains an inhibit-switch-frame
entry (see section Additional Options for Displaying Buffers), raises that frame if necessary.
This function creates a new frame, and displays the buffer in that
frame’s window. It actually performs the frame creation by calling
the function specified in pop-up-frame-function
(see section Additional Options for Displaying Buffers). If alist contains a
pop-up-frame-parameters entry, the associated value
is added to the newly created frame’s parameters.
This function tries to display buffer by splitting the largest
or least recently-used window (typically one on the selected frame).
It actually performs the split by calling the function specified in
split-window-preferred-function (see section Additional Options for Displaying Buffers).
The size of the new window can be adjusted by supplying
window-height and window-width entries in alist. To
adjust the window’s height, use an entry whose CAR is
window-height and whose CDR is one of:
nil means to leave the height of the new window alone.
shrink-window-if-larger-than-buffer and
fit-window-to-buffer, see Resizing Windows.
To adjust the window’s width, use an entry whose CAR is
window-width and whose CDR is one of:
nil means to leave the width of the new window alone.
This function can fail if no window splitting can be performed for some
reason (e.g., if the selected frame has an unsplittable frame
parameter; see section Buffer Parameters).
This function tries to display buffer in a window below the
selected window. This means to either split the selected window or use
the window below the selected one. If it does create a new window, it
will also adjust its size provided alist contains a suitable
window-height or window-width entry, see above.
This function tries to display buffer in a window previously
showing it. If alist has a non-nil
inhibit-same-window entry, the selected window is not eligible
for reuse. If alist contains a reusable-frames entry, its
value determines which frames to search for a suitable window as with
display-buffer-reuse-window.
If alist has a previous-window entry, the window
specified by that entry will override any other window found by the
methods above, even if that window never showed buffer before.
This function tries to display buffer in a window at the bottom of the selected frame.
This either splits the window at the bottom of the frame or the frame’s root window, or reuses an existing window at the bottom of the selected frame.
This function tries to display buffer by choosing an existing window and displaying the buffer in that window. It can fail if all windows are dedicated to another buffer (see section Dedicated Windows).
If alist has a non-nil allow-no-window entry, then
this function does not display buffer. This allows to override
the default action and avoid displaying the buffer. It is assumed that
when the caller specifies a non-nil allow-no-window value
it can handle a nil value returned from display-buffer in
this case.
To illustrate the use of action functions, consider the following example.
(display-buffer
(get-buffer-create "*foo*")
'((display-buffer-reuse-window
display-buffer-pop-up-window
display-buffer-pop-up-frame)
(reusable-frames . 0)
(window-height . 10) (window-width . 40)))
Evaluating the form above will cause display-buffer to proceed as
follows: If a buffer called *foo* already appears on a visible or
iconified frame, it will reuse its window. Otherwise, it will try to
pop up a new window or, if that is impossible, a new frame and show the
buffer there. If all these steps fail, it will proceed using whatever
display-buffer-base-action and
display-buffer-fallback-action prescribe.
Furthermore, display-buffer will try to adjust a reused window
(provided *foo* was put by display-buffer there before) or a
popped-up window as follows: If the window is part of a vertical
combination, it will set its height to ten lines. Note that if, instead
of the number “10”, we specified the function
fit-window-to-buffer, display-buffer would come up with a
one-line window to fit the empty buffer. If the window is part of a
horizontal combination, it sets its width to 40 columns. Whether a new
window is vertically or horizontally combined depends on the shape of
the window split and the values of
split-window-preferred-function, split-height-threshold
and split-width-threshold (see section Additional Options for Displaying Buffers).
Now suppose we combine this call with a preexisting setup for ‘display-buffer-alist’ as follows.
(let ((display-buffer-alist
(cons
'("\\*foo\\*"
(display-buffer-reuse-window display-buffer-below-selected)
(reusable-frames)
(window-height . 5))
display-buffer-alist)))
(display-buffer
(get-buffer-create "*foo*")
'((display-buffer-reuse-window
display-buffer-pop-up-window
display-buffer-pop-up-frame)
(reusable-frames . 0)
(window-height . 10) (window-width . 40))))
This form will have display-buffer first try reusing a window
that shows *foo* on the selected frame. If there’s no such window, it
will try to split the selected window or, if that is impossible, use the
window below the selected window.
If there’s no window below the selected one, or the window below the
selected one is dedicated to its buffer, display-buffer will
proceed as described in the previous example. Note, however, that when
it tries to adjust the height of any reused or popped-up window, it will
in any case try to set its number of lines to “5” since that value
overrides the corresponding specification in the action argument
of display-buffer.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The behavior of the standard display actions of display-buffer
(see section Choosing a Window for Display) can be modified by a variety of user
options.
If the value of this variable is non-nil, display-buffer
is allowed to split an existing window to make a new window for
displaying in. This is the default.
This variable is provided mainly for backward compatibility. It is
obeyed by display-buffer via a special mechanism in
display-buffer-fallback-action, which only calls the action
function display-buffer-pop-up-window (see section Action Functions for display-buffer) when the value is nil. It is not consulted by
display-buffer-pop-up-window itself, which the user may specify
directly in display-buffer-alist etc.
This variable specifies a function for splitting a window, in order to
make a new window for displaying a buffer. It is used by the
display-buffer-pop-up-window action function to actually split
the window (see section Action Functions for display-buffer).
The default value is split-window-sensibly, which is documented
below. The value must be a function that takes one argument, a window,
and return either a new window (which will be used to display the
desired buffer) or nil (which means the splitting failed).
This function tries to split window, and return the newly
created window. If window cannot be split, it returns
nil.
This function obeys the usual rules that determine when a window may
be split (see section Splitting Windows). It first tries to split by
placing the new window below, subject to the restriction imposed by
split-height-threshold (see below), in addition to any other
restrictions. If that fails, it tries to split by placing the new
window to the right, subject to split-width-threshold (see
below). If that fails, and the window is the only window on its
frame, this function again tries to split and place the new window
below, disregarding split-height-threshold. If this fails as
well, this function gives up and returns nil.
This variable, used by split-window-sensibly, specifies whether
to split the window placing the new window below. If it is an
integer, that means to split only if the original window has at least
that many lines. If it is nil, that means not to split this
way.
This variable, used by split-window-sensibly, specifies whether
to split the window placing the new window to the right. If the value
is an integer, that means to split only if the original window has at
least that many columns. If the value is nil, that means not
to split this way.
If the value of this variable is non-nil, that means
display-buffer may display buffers by making new frames. The
default is nil.
A non-nil value also means that when display-buffer is
looking for a window already displaying buffer-or-name, it can
search any visible or iconified frame, not just the selected frame.
This variable is provided mainly for backward compatibility. It is
obeyed by display-buffer via a special mechanism in
display-buffer-fallback-action, which calls the action function
display-buffer-pop-up-frame (see section Action Functions for display-buffer)
if the value is non-nil. (This is done before attempting to
split a window.) This variable is not consulted by
display-buffer-pop-up-frame itself, which the user may specify
directly in display-buffer-alist etc.
This variable specifies a function for creating a new frame, in order
to make a new window for displaying a buffer. It is used by the
display-buffer-pop-up-frame action function (see section Action Functions for display-buffer).
The value should be a function that takes no arguments and returns a
frame, or nil if no frame could be created. The default value
is a function that creates a frame using the parameters specified by
pop-up-frame-alist (see below).
This variable holds an alist of frame parameters (see section Frame Parameters), which is used by the default function in
pop-up-frame-function to make a new frame. The default is
nil.
A list of buffer names for buffers that should be displayed in the
selected window. If a buffer’s name is in this list,
display-buffer handles the buffer by showing it in the selected
window.
A list of regular expressions that specify buffers that should be
displayed in the selected window. If the buffer’s name matches any of
the regular expressions in this list, display-buffer handles the
buffer by showing it in the selected window.
This function returns t if displaying a buffer
named buffer-name with display-buffer would
put it in the selected window.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Each window remembers in a list the buffers it has previously displayed,
and the order in which these buffers were removed from it. This history
is used, for example, by replace-buffer-in-windows
(see section Buffers and Windows). The list is automatically maintained by
Emacs, but you can use the following functions to explicitly inspect or
alter it:
This function returns a list specifying the previous contents of window. The optional argument window should be a live window and defaults to the selected one.
Each list element has the form (buffer window-start
window-pos), where buffer is a buffer previously shown in
the window, window-start is the window start position
(see section The Window Start and End Positions) when that buffer was last shown, and
window-pos is the point position (see section Windows and Point) when
that buffer was last shown in window.
The list is ordered so that earlier elements correspond to more recently-shown buffers, and the first element usually corresponds to the buffer most recently removed from the window.
This function sets window’s previous buffers to the value of
prev-buffers. The argument window must be a live window
and defaults to the selected one. The argument prev-buffers
should be a list of the same form as that returned by
window-prev-buffers.
In addition, each buffer maintains a list of next buffers, which
is a list of buffers re-shown by switch-to-prev-buffer (see
below). This list is mainly used by switch-to-prev-buffer and
switch-to-next-buffer for choosing buffers to switch to.
This function returns the list of buffers recently re-shown in
window via switch-to-prev-buffer. The window
argument must denote a live window or nil (meaning the selected
window).
This function sets the next buffer list of window to
next-buffers. The window argument should be a live window
or nil (meaning the selected window). The argument
next-buffers should be a list of buffers.
The following commands can be used to cycle through the global buffer
list, much like bury-buffer and unbury-buffer. However,
they cycle according to the specified window’s history list, rather
than the global buffer list. In addition, they restore
window-specific window start and point positions, and may show a
buffer even if it is already shown in another window. The
switch-to-prev-buffer command, in particular, is used by
replace-buffer-in-windows, bury-buffer and
quit-window to find a replacement buffer for a window.
This command displays the previous buffer in window. The
argument window should be a live window or nil (meaning
the selected window). If the optional argument bury-or-kill is
non-nil, this means that the buffer currently shown in
window is about to be buried or killed and consequently should
not be switched to in future invocations of this command.
The previous buffer is usually the buffer shown before the buffer
currently shown in window. However, a buffer that has been buried
or killed, or has been already shown by a recent invocation of
switch-to-prev-buffer, does not qualify as previous buffer.
If repeated invocations of this command have already shown all buffers previously shown in window, further invocations will show buffers from the buffer list of the frame window appears on (see section The Buffer List), trying to skip buffers that are already shown in another window on that frame.
This command switches to the next buffer in window, thus undoing
the effect of the last switch-to-prev-buffer command in
window. The argument window must be a live window and
defaults to the selected one.
If there is no recent invocation of switch-to-prev-buffer that
can be undone, this function tries to show a buffer from the buffer list
of the frame window appears on (see section The Buffer List).
By default switch-to-prev-buffer and switch-to-next-buffer
can switch to a buffer that is already shown in another window on the
same frame. The following option can be used to override this behavior.
If this variable is non-nil, switch-to-prev-buffer and
switch-to-next-buffer may switch to a buffer that is already
visible on the same frame, provided the buffer was shown in the
relevant window before. If it is nil,
switch-to-prev-buffer and switch-to-next-buffer always
try to avoid switching to a buffer that is already visible in another
window on the same frame. The default is t.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Functions for displaying a buffer can be told to not use specific
windows by marking these windows as dedicated to their buffers.
display-buffer (see section Choosing a Window for Display) never uses a dedicated
window for displaying another buffer in it. get-lru-window and
get-largest-window (see section Cyclic Ordering of Windows) do not
consider dedicated windows as candidates when their dedicated
argument is non-nil. The behavior of set-window-buffer
(see section Buffers and Windows) with respect to dedicated windows is
slightly different, see below.
Functions supposed to remove a buffer from a window or a window from a frame can behave specially when a window they operate on is dedicated. We will distinguish three basic cases, namely where (1) the window is not the only window on its frame, (2) the window is the only window on its frame but there are other frames on the same terminal left, and (3) the window is the only window on the only frame on the same terminal.
In particular, delete-windows-on (see section Deleting Windows)
handles case (2) by deleting the associated frame and case (3) by
showing another buffer in that frame’s only window. The function
replace-buffer-in-windows (see section Buffers and Windows) which is
called when a buffer gets killed, deletes the window in case (1) and
behaves like delete-windows-on otherwise.
When bury-buffer (see section The Buffer List) operates on the
selected window (which shows the buffer that shall be buried), it
handles case (2) by calling frame-auto-hide-function
(see section Quitting Windows) to deal with the selected frame. The other
two cases are handled as with replace-buffer-in-windows.
This function returns non-nil if window is dedicated to its
buffer and nil otherwise. More precisely, the return value is
the value assigned by the last call of set-window-dedicated-p for
window, or nil if that function was never called with
window as its argument. The default for window is the
selected window.
This function marks window as dedicated to its buffer if
flag is non-nil, and non-dedicated otherwise.
As a special case, if flag is t, window becomes
strongly dedicated to its buffer. set-window-buffer
signals an error when the window it acts upon is strongly dedicated to
its buffer and does not already display the buffer it is asked to
display. Other functions do not treat t differently from any
non-nil value.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When you want to get rid of a window used for displaying a buffer, you
can call delete-window or delete-windows-on
(see section Deleting Windows) to remove that window from its frame. If the
buffer is shown on a separate frame, you might want to call
delete-frame (see section Deleting Frames) instead. If, on the other
hand, a window has been reused for displaying the buffer, you might
prefer showing the buffer previously shown in that window, by calling the
function switch-to-prev-buffer (see section Window History).
Finally, you might want to either bury (see section The Buffer List) or kill
(see section Killing Buffers) the window’s buffer.
The following command uses information on how the window for displaying the buffer was obtained in the first place, thus attempting to automate the above decisions for you.
This command quits window and buries its buffer. The argument
window must be a live window and defaults to the selected one.
With prefix argument kill non-nil, it kills the buffer
instead of burying it. It calls the function quit-restore-window
described next to deal with the window and its buffer.
This function tries to restore the state of window that existed before its buffer was displayed in it. The optional argument window must be a live window and defaults to the selected one.
If window was created specially for displaying its buffer, this
function deletes window provided its frame contains at least one
other live window. If window is the only window on its frame and
there are other frames on the frame’s terminal, the value of the
optional argument bury-or-kill determines how to proceed with the
window. If bury-or-kill equals kill, the frame is deleted
unconditionally. Otherwise, the fate of the frame is determined by
calling frame-auto-hide-function (see below) with that frame as
sole argument.
Otherwise, this function tries to redisplay the buffer previously shown in window. It also tries to restore the window start (see section The Window Start and End Positions) and point (see section Windows and Point) positions of the previously shown buffer. If, in addition, window’s buffer was temporarily resized, this function will also try to restore the original height of window.
The cases described so far require that the buffer shown in window
is still the buffer displayed by the last buffer display function for
this window. If another buffer has been shown in the meantime, or the
buffer previously shown no longer exists, this function calls
switch-to-prev-buffer (see section Window History) to show some other
buffer instead.
The optional argument bury-or-kill specifies how to deal with window’s buffer. The following values are handled:
nilThis means to not deal with the buffer in any particular way. As a
consequence, if window is not deleted, invoking
switch-to-prev-buffer will usually show the buffer again.
appendThis means that if window is not deleted, its buffer is moved to
the end of window’s list of previous buffers, so it’s less likely
that a future invocation of switch-to-prev-buffer will switch to
it. Also, it moves the buffer to the end of the frame’s buffer list.
buryThis means that if window is not deleted, its buffer is removed
from window’s list of previous buffers. Also, it moves the buffer
to the end of the frame’s buffer list. This value provides the most
reliable remedy to not have switch-to-prev-buffer switch to this
buffer again without killing the buffer.
killThis means to kill window’s buffer.
quit-restore-window bases its decisions on information stored in
window’s quit-restore window parameter (see section Window Parameters), and resets that parameter to nil after it’s done.
The following option specifies how to deal with a frame containing just one window that should be either quit, or whose buffer should be buried.
The function specified by this option is called to automatically hide frames. This function is called with one argument—a frame.
The function specified here is called by bury-buffer
(see section The Buffer List) when the selected window is dedicated and shows
the buffer to bury. It is also called by quit-restore-window
(see above) when the frame of the window to quit has been specially
created for displaying that window’s buffer and the buffer is not
killed.
The default is to call iconify-frame (see section Visibility of Frames). Alternatively, you may specify either delete-frame
(see section Deleting Frames) to remove the frame from its display,
ignore to leave the frame unchanged, or any other function that
can take a frame as its sole argument.
Note that the function specified by this option is called only if the specified frame contains just one live window and there is at least one other frame on the same terminal.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Each window has its own value of point (see section Point), independent of the value of point in other windows displaying the same buffer. This makes it useful to have multiple windows showing one buffer.
As far as the user is concerned, point is where the cursor is, and when the user switches to another buffer, the cursor jumps to the position of point in that buffer.
This function returns the current position of point in window. For a nonselected window, this is the value point would have (in that window’s buffer) if that window were selected. The default for window is the selected window.
When window is the selected window, the value returned is the
value of point in that window’s buffer. Strictly speaking, it would be
more correct to return the “top-level” value of point, outside of any
save-excursion forms. But that value is hard to find.
This function positions point in window at position position in window’s buffer. It returns position.
If window is selected, this simply does goto-char in
window’s buffer.
This variable specifies the marker insertion type (see section Marker Insertion Types) of window-point. The default is nil,
so window-point will stay behind text inserted there.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Each window maintains a marker used to keep track of a buffer position that specifies where in the buffer display should start. This position is called the display-start position of the window (or just the start). The character after this position is the one that appears at the upper left corner of the window. It is usually, but not inevitably, at the beginning of a text line.
After switching windows or buffers, and in some other cases, if the window start is in the middle of a line, Emacs adjusts the window start to the start of a line. This prevents certain operations from leaving the window start at a meaningless point within a line. This feature may interfere with testing some Lisp code by executing it using the commands of Lisp mode, because they trigger this readjustment. To test such code, put it into a command and bind the command to a key.
This function returns the display-start position of window
window. If window is nil, the selected window is
used.
When you create a window, or display a different buffer in it, the
display-start position is set to a display-start position recently used
for the same buffer, or to point-min if the buffer doesn’t have
any.
Redisplay updates the window-start position (if you have not specified it explicitly since the previous redisplay)—to make sure point appears on the screen. Nothing except redisplay automatically changes the window-start position; if you move point, do not expect the window-start position to change in response until after the next redisplay.
This function returns the position where display of its buffer ends in window. The default for window is the selected window.
Simply changing the buffer text or moving point does not update the
value that window-end returns. The value is updated only when
Emacs redisplays and redisplay completes without being preempted.
If the last redisplay of window was preempted, and did not finish,
Emacs does not know the position of the end of display in that window.
In that case, this function returns nil.
If update is non-nil, window-end always returns an
up-to-date value for where display ends, based on the current
window-start value. If a previously saved value of that position
is still valid, window-end returns that value; otherwise it
computes the correct value by scanning the buffer text.
Even if update is non-nil, window-end does not
attempt to scroll the display if point has moved off the screen, the
way real redisplay would do. It does not alter the
window-start value. In effect, it reports where the displayed
text will end if scrolling is not required.
This function sets the display-start position of window to position in window’s buffer. It returns position.
The display routines insist that the position of point be visible when a
buffer is displayed. Normally, they change the display-start position
(that is, scroll the window) whenever necessary to make point visible.
However, if you specify the start position with this function using
nil for noforce, it means you want display to start at
position even if that would put the location of point off the
screen. If this does place point off screen, the display routines move
point to the left margin on the middle line in the window.
For example, if point is 1 and you set the start of the window to 37, the start of the next line, point will be “above” the top of the window. The display routines will automatically move point if it is still 1 when redisplay occurs. Here is an example:
;; Here is what ‘foo’ looks like before executing
;; the set-window-start expression.
---------- Buffer: foo ---------- ∗This is the contents of buffer foo. 2 3 4 5 6 ---------- Buffer: foo ----------
(set-window-start (selected-window) (save-excursion (goto-char 1) (forward-line 1) (point))) ⇒ 37
;; Here is what ‘foo’ looks like after executing
;; the set-window-start expression.
---------- Buffer: foo ----------
2
3
∗4
5
6
---------- Buffer: foo ----------
If noforce is non-nil, and position would place point
off screen at the next redisplay, then redisplay computes a new window-start
position that works well with point, and thus position is not used.
This function returns non-nil if position is within the
range of text currently visible on the screen in window. It
returns nil if position is scrolled vertically out of view.
Locations that are partially obscured are not considered visible unless
partially is non-nil. The argument position defaults
to the current position of point in window; window, to the
selected window. If position is t, that means to check the
last visible position in window.
This function considers only vertical scrolling. If position is
out of view only because window has been scrolled horizontally,
pos-visible-in-window-p returns non-nil anyway.
See section Horizontal Scrolling.
If position is visible, pos-visible-in-window-p returns
t if partially is nil; if partially is
non-nil, and the character following position is fully
visible, it returns a list of the form (x y), where
x and y are the pixel coordinates relative to the top left
corner of the window; otherwise it returns an extended list of the form
(x y rtop rbot rowh vpos),
where rtop and rbot specify the number of off-window pixels
at the top and bottom of the row at position, rowh specifies
the visible height of that row, and vpos specifies the vertical
position (zero-based row number) of that row.
Here is an example:
;; If point is off the screen now, recenter it now.
(or (pos-visible-in-window-p
(point) (selected-window))
(recenter 0))
This function returns the height of text line line in
window. If line is one of header-line or
mode-line, window-line-height returns information about
the corresponding line of the window. Otherwise, line is a text
line number starting from 0. A negative number counts from the end of
the window. The default for line is the current line in
window; the default for window is the selected window.
If the display is not up to date, window-line-height returns
nil. In that case, pos-visible-in-window-p may be used
to obtain related information.
If there is no line corresponding to the specified line,
window-line-height returns nil. Otherwise, it returns
a list (height vpos ypos offbot),
where height is the height in pixels of the visible part of the
line, vpos and ypos are the vertical position in lines and
pixels of the line relative to the top of the first text line, and
offbot is the number of off-window pixels at the bottom of the
text line. If there are off-window pixels at the top of the (first)
text line, ypos is negative.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Textual scrolling means moving the text up or down through a
window. It works by changing the window’s display-start location. It
may also change the value of window-point to keep point on the
screen (see section Windows and Point).
The basic textual scrolling functions are scroll-up (which
scrolls forward) and scroll-down (which scrolls backward). In
these function names, “up” and “down” refer to the direction of
motion of the buffer text relative to the window. Imagine that the
text is written on a long roll of paper and that the scrolling
commands move the paper up and down. Thus, if you are looking at the
middle of a buffer and repeatedly call scroll-down, you will
eventually see the beginning of the buffer.
Unfortunately, this sometimes causes confusion, because some people tend to think in terms of the opposite convention: they imagine the window moving over text that remains in place, so that “down” commands take you to the end of the buffer. This convention is consistent with fact that such a command is bound to a key named PageDown on modern keyboards.
Textual scrolling functions (aside from scroll-other-window)
have unpredictable results if the current buffer is not the one
displayed in the selected window. See section The Current Buffer.
If the window contains a row taller than the height of the window
(for example in the presence of a large image), the scroll functions
will adjust the window’s vertical scroll position to scroll the
partially visible row. Lisp callers can disable this feature by
binding the variable auto-window-vscroll to nil
(see section Vertical Fractional Scrolling).
This function scrolls forward by count lines in the selected window.
If count is negative, it scrolls backward instead. If
count is nil (or omitted), the distance scrolled is
next-screen-context-lines lines less than the height of the
window’s text area.
If the selected window cannot be scrolled any further, this function
signals an error. Otherwise, it returns nil.
This function scrolls backward by count lines in the selected window.
If count is negative, it scrolls forward instead. In other
respects, it behaves the same way as scroll-up does.
This behaves like scroll-up, except that if the selected window
cannot be scrolled any further and the value of the variable
scroll-error-top-bottom is t, it tries to move to the
end of the buffer instead. If point is already there, it signals an
error.
This behaves like scroll-down, except that if the selected
window cannot be scrolled any further and the value of the variable
scroll-error-top-bottom is t, it tries to move to the
beginning of the buffer instead. If point is already there, it
signals an error.
This function scrolls the text in another window upward count
lines. Negative values of count, or nil, are handled
as in scroll-up.
You can specify which buffer to scroll by setting the variable
other-window-scroll-buffer to a buffer. If that buffer isn’t
already displayed, scroll-other-window displays it in some
window.
When the selected window is the minibuffer, the next window is normally
the leftmost one immediately above it. You can specify a different
window to scroll, when the minibuffer is selected, by setting the variable
minibuffer-scroll-window. This variable has no effect when any
other window is selected. When it is non-nil and the
minibuffer is selected, it takes precedence over
other-window-scroll-buffer. See Definition of minibuffer-scroll-window.
When the minibuffer is active, it is the next window if the selected
window is the one at the bottom right corner. In this case,
scroll-other-window attempts to scroll the minibuffer. If the
minibuffer contains just one line, it has nowhere to scroll to, so the
line reappears after the echo area momentarily displays the message
‘End of buffer’.
If this variable is non-nil, it tells scroll-other-window
which buffer’s window to scroll.
This option specifies the size of the scroll margin—a minimum number of lines between point and the top or bottom of a window. Whenever point gets within this many lines of the top or bottom of the window, redisplay scrolls the text automatically (if possible) to move point out of the margin, closer to the center of the window.
This variable controls how scrolling is done automatically when point
moves off the screen (or into the scroll margin). If the value is a
positive integer n, then redisplay scrolls the text up to
n lines in either direction, if that will bring point back into
proper view. This behavior is called conservative scrolling.
Otherwise, scrolling happens in the usual way, under the control of
other variables such as scroll-up-aggressively and
scroll-down-aggressively.
The default value is zero, which means that conservative scrolling never happens.
The value of this variable should be either nil or a fraction
f between 0 and 1. If it is a fraction, that specifies where on
the screen to put point when scrolling down. More precisely, when a
window scrolls down because point is above the window start, the new
start position is chosen to put point f part of the window
height from the top. The larger f, the more aggressive the
scrolling.
A value of nil is equivalent to .5, since its effect is to center
point. This variable automatically becomes buffer-local when set in any
fashion.
Likewise, for scrolling up. The value, f, specifies how far
point should be placed from the bottom of the window; thus, as with
scroll-up-aggressively, a larger value scrolls more aggressively.
This variable is an older variant of scroll-conservatively.
The difference is that if its value is n, that permits scrolling
only by precisely n lines, not a smaller number. This feature
does not work with scroll-margin. The default value is zero.
If this option is t, whenever a scrolling command moves point
off-window, Emacs tries to adjust point to keep the cursor at its old
vertical position in the window, rather than the window edge.
If the value is non-nil and not t, Emacs adjusts point
to keep the cursor at the same vertical position, even if the
scrolling command didn’t move point off-window.
This option affects all scroll commands that have a non-nil
scroll-command symbol property.
The value of this variable is the number of lines of continuity to
retain when scrolling by full screens. For example, scroll-up
with an argument of nil scrolls so that this many lines at the
bottom of the window appear instead at the top. The default value is
2.
If this option is nil (the default), scroll-up-command
and scroll-down-command simply signal an error when no more
scrolling is possible.
If the value is t, these commands instead move point to the
beginning or end of the buffer (depending on scrolling direction);
only if point is already on that position do they signal an error.
This function scrolls the text in the selected window so that point is displayed at a specified vertical position within the window. It does not “move point” with respect to the text.
If count is a non-negative number, that puts the line containing point count lines down from the top of the window. If count is a negative number, then it counts upward from the bottom of the window, so that -1 stands for the last usable line in the window.
If count is nil (or a non-nil list),
recenter puts the line containing point in the middle of the
window. If count is nil, this function may redraw the
frame, according to the value of recenter-redisplay.
When recenter is called interactively, count is the raw
prefix argument. Thus, typing C-u as the prefix sets the
count to a non-nil list, while typing C-u 4 sets
count to 4, which positions the current line four lines from the
top.
With an argument of zero, recenter positions the current line at
the top of the window. The command recenter-top-bottom offers
a more convenient way to achieve this.
If this variable is non-nil, calling recenter with a
nil argument redraws the frame. The default value is
tty, which means only redraw the frame if it is a tty frame.
This command, which is the default binding for C-l, acts like
recenter, except if called with no argument. In that case,
successive calls place point according to the cycling order defined
by the variable recenter-positions.
This variable controls how recenter-top-bottom behaves when
called with no argument. The default value is (middle top
bottom), which means that successive calls of
recenter-top-bottom with no argument cycle between placing
point at the middle, top, and bottom of the window.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Vertical fractional scrolling means shifting text in a window up or down by a specified multiple or fraction of a line. Each window has a vertical scroll position, which is a number, never less than zero. It specifies how far to raise the contents of the window. Raising the window contents generally makes all or part of some lines disappear off the top, and all or part of some other lines appear at the bottom. The usual value is zero.
The vertical scroll position is measured in units of the normal line height, which is the height of the default font. Thus, if the value is .5, that means the window contents are scrolled up half the normal line height. If it is 3.3, that means the window contents are scrolled up somewhat over three times the normal line height.
What fraction of a line the vertical scrolling covers, or how many lines, depends on what the lines contain. A value of .5 could scroll a line whose height is very short off the screen, while a value of 3.3 could scroll just part of the way through a tall line or an image.
This function returns the current vertical scroll position of
window. The default for window is the selected window.
If pixels-p is non-nil, the return value is measured in
pixels, rather than in units of the normal line height.
(window-vscroll)
⇒ 0
This function sets window’s vertical scroll position to
lines. If window is nil, the selected window is
used. The argument lines should be zero or positive; if not, it
is taken as zero.
The actual vertical scroll position must always correspond to an integral number of pixels, so the value you specify is rounded accordingly.
The return value is the result of this rounding.
(set-window-vscroll (selected-window) 1.2)
⇒ 1.13
If pixels-p is non-nil, lines specifies a number of
pixels. In this case, the return value is lines.
If this variable is non-nil, the line-move,
scroll-up, and scroll-down functions will automatically
modify the vertical scroll position to scroll through display rows
that are taller than the height of the window, for example in the
presence of large images.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Horizontal scrolling means shifting the image in the window left or right by a specified multiple of the normal character width. Each window has a horizontal scroll position, which is a number, never less than zero. It specifies how far to shift the contents left. Shifting the window contents left generally makes all or part of some characters disappear off the left, and all or part of some other characters appear at the right. The usual value is zero.
The horizontal scroll position is measured in units of the normal character width, which is the width of space in the default font. Thus, if the value is 5, that means the window contents are scrolled left by 5 times the normal character width. How many characters actually disappear off to the left depends on their width, and could vary from line to line.
Because we read from side to side in the “inner loop”, and from top to bottom in the “outer loop”, the effect of horizontal scrolling is not like that of textual or vertical scrolling. Textual scrolling involves selection of a portion of text to display, and vertical scrolling moves the window contents contiguously; but horizontal scrolling causes part of each line to go off screen.
Usually, no horizontal scrolling is in effect; then the leftmost column is at the left edge of the window. In this state, scrolling to the right is meaningless, since there is no data to the left of the edge to be revealed by it; so this is not allowed. Scrolling to the left is allowed; it scrolls the first columns of text off the edge of the window and can reveal additional columns on the right that were truncated before. Once a window has a nonzero amount of leftward horizontal scrolling, you can scroll it back to the right, but only so far as to reduce the net horizontal scroll to zero. There is no limit to how far left you can scroll, but eventually all the text will disappear off the left edge.
If auto-hscroll-mode is set, redisplay automatically alters
the horizontal scrolling of a window as necessary to ensure that point
is always visible. However, you can still set the horizontal
scrolling value explicitly. The value you specify serves as a lower
bound for automatic scrolling, i.e., automatic scrolling will not
scroll a window to a column less than the specified one.
This function scrolls the selected window count columns to the left (or to the right if count is negative). The default for count is the window width, minus 2.
The return value is the total amount of leftward horizontal scrolling in
effect after the change—just like the value returned by
window-hscroll (below).
Once you scroll a window as far right as it can go, back to its normal position where the total leftward scrolling is zero, attempts to scroll any farther right have no effect.
If set-minimum is non-nil, the new scroll amount becomes
the lower bound for automatic scrolling; that is, automatic scrolling
will not scroll a window to a column less than the value returned by
this function. Interactive calls pass non-nil for
set-minimum.
This function scrolls the selected window count columns to the
right (or to the left if count is negative). The default
for count is the window width, minus 2. Aside from the direction
of scrolling, this works just like scroll-left.
This function returns the total leftward horizontal scrolling of window—the number of columns by which the text in window is scrolled left past the left margin. The default for window is the selected window.
The return value is never negative. It is zero when no horizontal scrolling has been done in window (which is usually the case).
(window-hscroll)
⇒ 0
(scroll-left 5)
⇒ 5
(window-hscroll)
⇒ 5
This function sets horizontal scrolling of window. The value of columns specifies the amount of scrolling, in terms of columns from the left margin. The argument columns should be zero or positive; if not, it is taken as zero. Fractional values of columns are not supported at present.
Note that set-window-hscroll may appear not to work if you test
it by evaluating a call with M-: in a simple way. What happens
is that the function sets the horizontal scroll value and returns, but
then redisplay adjusts the horizontal scrolling to make point visible,
and this overrides what the function did. You can observe the
function’s effect if you call it while point is sufficiently far from
the left margin that it will remain visible.
The value returned is columns.
(set-window-hscroll (selected-window) 10)
⇒ 10
Here is how you can determine whether a given position position is off the screen due to horizontal scrolling:
(defun hscroll-on-screen (window position)
(save-excursion
(goto-char position)
(and
(>= (- (current-column) (window-hscroll window)) 0)
(< (- (current-column) (window-hscroll window))
(window-width window)))))
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes functions that report the position of a window. Most of these functions report positions relative to the window’s frame. In this case, the coordinate origin ‘(0,0)’ lies near the upper left corner of the frame. For technical reasons, on graphical displays the origin is not located at the exact corner of the graphical window as it appears on the screen. If Emacs is built with the GTK+ toolkit, the origin is at the upper left corner of the frame area used for displaying Emacs windows, below the title-bar, GTK+ menu bar, and tool bar (since these are drawn by the window manager and/or GTK+, not by Emacs). But if Emacs is not built with GTK+, the origin is at the upper left corner of the tool bar (since in this case Emacs itself draws the tool bar). In both cases, the X and Y coordinates increase rightward and downward respectively.
Except where noted, X and Y coordinates are reported in integer character units, i.e., numbers of lines and columns respectively. On a graphical display, each “line” and “column” corresponds to the height and width of a default character specified by the frame’s default font.
This function returns a list of the edge coordinates of window.
If window is omitted or nil, it defaults to the selected
window.
The return value has the form (left top right
bottom). These list elements are, respectively, the X
coordinate of the leftmost column occupied by the window, the Y
coordinate of the topmost row, the X coordinate one column to the
right of the rightmost column, and the Y coordinate one row down from
the bottommost row.
Note that these are the actual outer edges of the window, including any header line, mode line, scroll bar, fringes, window divider and display margins. On a text terminal, if the window has a neighbor on its right, its right edge includes the separator line between the window and its neighbor.
This function is similar to window-edges, but the returned edge
values are for the text area of the window. They exclude any header
line, mode line, scroll bar, fringes, window divider, display margins,
and vertical separator.
This function returns the Y coordinate of the topmost row of
window, equivalent to the top entry in the list returned
by window-edges.
This function returns the X coordinate of the leftmost column of
window, equivalent to the left entry in the list returned
by window-edges.
The following functions can be used to relate a set of frame-relative coordinates to a window:
This function returns the live window at the frame-relative
coordinates x and y, on frame frame. If there is no
window at that position, the return value is nil. If
frame is omitted or nil, it defaults to the selected
frame.
This function checks whether a window window occupies the
frame-relative coordinates coordinates, and if so, which part of
the window that is. window should be a live window.
coordinates should be a cons cell of the form (x
. y), where x and y are frame-relative coordinates.
If there is no window at the specified position, the return value is
nil . Otherwise, the return value is one of the following:
(relx . rely)The coordinates are inside window. The numbers relx and rely are the equivalent window-relative coordinates for the specified position, counting from 0 at the top left corner of the window.
mode-lineThe coordinates are in the mode line of window.
header-lineThe coordinates are in the header line of window.
right-dividerThe coordinates are in the divider separating window from a window on the right.
right-dividerThe coordinates are in the divider separating window from a window beneath.
vertical-lineThe coordinates are in the vertical line between window and its neighbor to the right. This value occurs only if the window doesn’t have a scroll bar; positions in a scroll bar are considered outside the window for these purposes.
left-fringeright-fringeThe coordinates are in the left or right fringe of the window.
left-marginright-marginThe coordinates are in the left or right margin of the window.
nilThe coordinates are not in any part of window.
The function coordinates-in-window-p does not require a frame as
argument because it always uses the frame that window is on.
The following functions return window positions in pixels, rather than character units. Though mostly useful on graphical displays, they can also be called on text terminals, where the screen area of each text character is taken to be “one pixel”.
This function returns a list of pixel coordinates for the edges of
window. If window is omitted or nil, it defaults
to the selected window.
The return value has the form (left top right
bottom). The list elements are, respectively, the X pixel
coordinate of the left window edge, the Y pixel coordinate of the top
edge, one more than the X pixel coordinate of the right edge, and one
more than the Y pixel coordinate of the bottom edge.
This function is like window-pixel-edges, except that it
returns the pixel coordinates for the edges of the window’s text area,
rather than the pixel coordinates for the edges of the window itself.
window must specify a live window.
The following functions return window positions in pixels, relative to the display screen rather than the frame:
This function is like window-pixel-edges, except that it
returns the edge pixel coordinates relative to the top left corner of
the display screen.
This function is like window-inside-pixel-edges, except that it
returns the edge pixel coordinates relative to the top left corner of
the display screen. window must specify a live window.
This function returns the left pixel edge of window window. window must be a valid window and defaults to the selected one.
This function returns the top pixel edge of window window. window must be a valid window and defaults to the selected one.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A window configuration records the entire layout of one
frame—all windows, their sizes, which buffers they contain, how those
buffers are scrolled, and their values of point and the mark; also their
fringes, margins, and scroll bar settings. It also includes the value
of minibuffer-scroll-window. As a special exception, the window
configuration does not record the value of point in the selected window
for the current buffer.
You can bring back an entire frame layout by restoring a previously saved window configuration. If you want to record the layout of all frames instead of just one, use a frame configuration instead of a window configuration. See section Frame Configurations.
This function returns a new object representing frame’s current
window configuration. The default for frame is the selected
frame. The variable window-persistent-parameters specifies
which window parameters (if any) are saved by this function.
See section Window Parameters.
This function restores the configuration of windows and buffers as specified by configuration, for the frame that configuration was created for.
The argument configuration must be a value that was previously
returned by current-window-configuration. The configuration is
restored in the frame from which configuration was made, whether
that frame is selected or not. This always counts as a window size
change and triggers execution of the window-size-change-functions
(see section Hooks for Window Scrolling and Changes), because set-window-configuration doesn’t
know how to tell whether the new configuration actually differs from the
old one.
If the frame from which configuration was saved is dead, all this
function does is restore the three variables window-min-height,
window-min-width and minibuffer-scroll-window. In this
case, the function returns nil. Otherwise, it returns t.
Here is a way of using this function to get the same effect
as save-window-excursion:
(let ((config (current-window-configuration)))
(unwind-protect
(progn (split-window-below nil)
…)
(set-window-configuration config)))
This macro records the window configuration of the selected frame, executes forms in sequence, then restores the earlier window configuration. The return value is the value of the final form in forms.
Most Lisp code should not use this macro; save-selected-window
is typically sufficient. In particular, this macro cannot reliably
prevent the code in forms from opening new windows, because new
windows might be opened in other frames (see section Choosing a Window for Display), and
save-window-excursion only saves and restores the window
configuration on the current frame.
Do not use this macro in window-size-change-functions; exiting
the macro triggers execution of window-size-change-functions,
leading to an endless loop.
This function returns t if object is a window configuration.
This function compares two window configurations as regards the
structure of windows, but ignores the values of point and mark and the
saved scrolling positions—it can return t even if those
aspects differ.
The function equal can also compare two window configurations; it
regards configurations as unequal if they differ in any respect, even a
saved point or mark.
This function returns the frame for which the window configuration config was made.
Other primitives to look inside of window configurations would make sense, but are not implemented because we did not need them. See the file winner.el for some more operations on windows configurations.
The objects returned by current-window-configuration die
together with the Emacs process. In order to store a window
configuration on disk and read it back in another Emacs session, you
can use the functions described next. These functions are also useful
to clone the state of a frame into an arbitrary live window
(set-window-configuration effectively clones the windows of a
frame into the root window of that very frame only).
This function returns the state of window as a Lisp object. The argument window must be a valid window and defaults to the root window of the selected frame.
If the optional argument writable is non-nil, this means to
not use markers for sampling positions like window-point or
window-start. This argument should be non-nil when the
state will be written to disk and read back in another session.
Together, the argument writable and the variable
window-persistent-parameters specify which window parameters are
saved by this function. See section Window Parameters.
The value returned by window-state-get can be used in the same
session to make a clone of a window in another window. It can be also
written to disk and read back in another session. In either case, use
the following function to restore the state of the window.
This function puts the window state state into window.
The argument state should be the state of a window returned by
an earlier invocation of window-state-get, see above. The
optional argument window can be either a live window or an
internal window (see section Windows and Frames) and defaults to the
selected one. If window is not live, it is replaced by a live
window before putting state into it.
If the optional argument ignore is non-nil, it means to ignore
minimum window sizes and fixed-size restrictions. If ignore
is safe, this means windows can get as small as one line
and/or two columns.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes how window parameters can be used to associate additional information with windows.
This function returns window’s value for parameter. The
default for window is the selected window. If window has no
setting for parameter, this function returns nil.
This function returns all parameters of window and their values.
The default for window is the selected window. The return value
is either nil, or an association list whose elements have the form
(parameter . value).
This function sets window’s value of parameter to value and returns value. The default for window is the selected window.
By default, the functions that save and restore window configurations or the
states of windows (see section Window Configurations) do not care about
window parameters. This means that when you change the value of a
parameter within the body of a save-window-excursion, the
previous value is not restored when that macro exits. It also means
that when you restore via window-state-put a window state saved
earlier by window-state-get, all cloned windows have their
parameters reset to nil. The following variable allows you to
override the standard behavior:
This variable is an alist specifying which parameters get saved by
current-window-configuration and window-state-get, and
subsequently restored by set-window-configuration and
window-state-put. See section Window Configurations.
The CAR of each entry of this alist is a symbol specifying the parameter. The CDR should be one of the following:
nilThis value means the parameter is saved neither by
window-state-get nor by current-window-configuration.
tThis value specifies that the parameter is saved by
current-window-configuration and (provided its writable
argument is nil) by window-state-get.
writableThis means that the parameter is saved unconditionally by both
current-window-configuration and window-state-get. This
value should not be used for parameters whose values do not have a read
syntax. Otherwise, invoking window-state-put in another session
may fail with an invalid-read-syntax error.
Some functions (notably delete-window,
delete-other-windows and split-window), may behave specially
when their window argument has a parameter set. You can override
such special behavior by binding the following variable to a
non-nil value:
If this variable is non-nil, some standard functions do not
process window parameters. The functions currently affected by this are
split-window, delete-window, delete-other-windows,
and other-window.
An application can bind this variable to a non-nil value around
calls to these functions. If it does so, the application is fully
responsible for correctly assigning the parameters of all involved
windows when exiting that function.
The following parameters are currently used by the window management code:
delete-windowThis parameter affects the execution of delete-window
(see section Deleting Windows).
delete-other-windowsThis parameter affects the execution of delete-other-windows
(see section Deleting Windows).
split-windowThis parameter affects the execution of split-window
(see section Splitting Windows).
other-windowThis parameter affects the execution of other-window
(see section Cyclic Ordering of Windows).
no-other-windowThis parameter marks the window as not selectable by other-window
(see section Cyclic Ordering of Windows).
clone-ofThis parameter specifies the window that this one has been cloned
from. It is installed by window-state-get (see section Window Configurations).
quit-restoreThis parameter is installed by the buffer display functions
(see section Choosing a Window for Display) and consulted by quit-restore-window
(see section Quitting Windows). It contains four elements:
The first element is one of the symbols window, meaning that the
window has been specially created by display-buffer; frame,
a separate frame has been created; same, the window has
displayed the same buffer before; or other, the window showed
another buffer before.
The second element is either one of the symbols window or
frame, or a list whose elements are the buffer shown in the
window before, that buffer’s window start and window point positions,
and the window’s height at that time.
The third element is the window selected at the time the parameter was
created. The function quit-restore-window tries to reselect that
window when it deletes the window passed to it as argument.
The fourth element is the buffer whose display caused the creation of
this parameter. quit-restore-window deletes the specified window
only if it still shows that buffer.
There are additional parameters window-atom and window-side;
these are reserved and should not be used by applications.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes how a Lisp program can take action whenever a
window displays a different part of its buffer or a different buffer.
There are three actions that can change this: scrolling the window,
switching buffers in the window, and changing the size of the window.
The first two actions run window-scroll-functions; the last runs
window-size-change-functions.
This variable holds a list of functions that Emacs should call before redisplaying a window with scrolling. Displaying a different buffer in the window also runs these functions.
This variable is not a normal hook, because each function is called with two arguments: the window, and its new display-start position.
These functions must take care when using window-end
(see section The Window Start and End Positions); if you need an up-to-date value, you
must use the update argument to ensure you get it.
Warning: don’t use this feature to alter the way the window is scrolled. It’s not designed for that, and such use probably won’t work.
This variable holds a list of functions to be called if the size of any window changes for any reason. The functions are called just once per redisplay, and just once for each frame on which size changes have occurred.
Each function receives the frame as its sole argument. There is no direct way to find out which windows on that frame have changed size, or precisely how. However, if a size-change function records, at each call, the existing windows and their sizes, it can also compare the present sizes and the previous sizes.
Creating or deleting windows counts as a size change, and therefore causes these functions to be called. Changing the frame size also counts, because it changes the sizes of the existing windows.
You may use save-selected-window in these functions
(see section Selecting Windows). However, do not use
save-window-excursion (see section Window Configurations); exiting
that macro counts as a size change, which would cause these functions
to be called over and over.
A normal hook that is run every time you change the window configuration of an existing frame. This includes splitting or deleting windows, changing the sizes of windows, or displaying a different buffer in a window.
The buffer-local part of this hook is run once for each window on the affected frame, with the relevant window selected and its buffer current. The global part is run once for the modified frame, with that frame selected.
In addition, you can use jit-lock-register to register a Font
Lock fontification function, which will be called whenever parts of a
buffer are (re)fontified because a window was scrolled or its size
changed. See section Other Font Lock Variables.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A frame is a screen object that contains one or more Emacs windows (see section Windows). It is the kind of object called a “window” in the terminology of graphical environments; but we can’t call it a “window” here, because Emacs uses that word in a different way. In Emacs Lisp, a frame object is a Lisp object that represents a frame on the screen. See section Frame Type.
A frame initially contains a single main window and/or a minibuffer window; you can subdivide the main window vertically or horizontally into smaller windows. See section Splitting Windows.
A terminal is a display device capable of displaying one or more Emacs frames. In Emacs Lisp, a terminal object is a Lisp object that represents a terminal. See section Terminal Type.
There are two classes of terminals: text terminals and
graphical terminals. Text terminals are non-graphics-capable
displays, including xterm and other terminal emulators. On
a text terminal, each Emacs frame occupies the terminal’s entire
screen; although you can create additional frames and switch between
them, the terminal only shows one frame at a time. Graphical
terminals, on the other hand, are managed by graphical display systems
such as the X Window System, which allow Emacs to show multiple frames
simultaneously on the same display.
On GNU and Unix systems, you can create additional frames on any available terminal, within a single Emacs session, regardless of whether Emacs was started on a text or graphical terminal. Emacs can display on both graphical and text terminals simultaneously. This comes in handy, for instance, when you connect to the same session from several remote locations. See section Multiple Terminals.
This predicate returns a non-nil value if object is a
frame, and nil otherwise. For a frame, the value indicates which
kind of display the frame uses:
tThe frame is displayed on a text terminal.
xThe frame is displayed on an X graphical terminal.
w32The frame is displayed on a MS-Windows graphical terminal.
nsThe frame is displayed on a GNUstep or Macintosh Cocoa graphical terminal.
pcThe frame is displayed on an MS-DOS terminal.
This function returns the terminal object that displays frame.
If frame is nil or unspecified, it defaults to the
selected frame.
This predicate returns a non-nil value if object is a
terminal that is live (i.e., not deleted), and nil otherwise.
For live terminals, the return value indicates what kind of frames are
displayed on that terminal; the list of possible values is the same as
for framep above.
| 28.1 Creating Frames | Creating additional frames. | |
| 28.2 Multiple Terminals | Displaying on several different devices. | |
| 28.3 Frame Parameters | Controlling frame size, position, font, etc. | |
| 28.4 Terminal Parameters | Parameters common for all frames on terminal. | |
| 28.5 Frame Titles | Automatic updating of frame titles. | |
| 28.6 Deleting Frames | Frames last until explicitly deleted. | |
| 28.7 Finding All Frames | How to examine all existing frames. | |
| 28.8 Minibuffers and Frames | How a frame finds the minibuffer to use. | |
| 28.9 Input Focus | Specifying the selected frame. | |
| 28.10 Visibility of Frames | Frames may be visible or invisible, or icons. | |
| 28.11 Raising and Lowering Frames | Raising a frame makes it hide other windows; lowering it makes the others hide it. | |
| 28.12 Frame Configurations | Saving the state of all frames. | |
| 28.13 Mouse Tracking | Getting events that say when the mouse moves. | |
| 28.14 Mouse Position | Asking where the mouse is, or moving it. | |
| 28.15 Pop-Up Menus | Displaying a menu for the user to select from. | |
| 28.16 Dialog Boxes | Displaying a box to ask yes or no. | |
| 28.17 Pointer Shape | Specifying the shape of the mouse pointer. | |
| 28.18 Window System Selections | Transferring text to and from other X clients. | |
| 28.19 Drag and Drop | Internals of Drag-and-Drop implementation. | |
| 28.20 Color Names | Getting the definitions of color names. | |
| 28.21 Text Terminal Colors | Defining colors for text terminals. | |
| 28.22 X Resources | Getting resource values from the server. | |
| 28.23 Display Feature Testing | Determining the features of a terminal. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To create a new frame, call the function make-frame.
This function creates and returns a new frame, displaying the current buffer.
The alist argument is an alist that specifies frame parameters
for the new frame. See section Frame Parameters. If you specify the
terminal parameter in alist, the new frame is created on
that terminal. Otherwise, if you specify the window-system
frame parameter in alist, that determines whether the frame
should be displayed on a text terminal or a graphical terminal.
See section Window Systems. If neither is specified, the new frame is
created in the same terminal as the selected frame.
Any parameters not mentioned in alist default to the values in
the alist default-frame-alist (see section Initial Frame Parameters);
parameters not specified there default from the X resources or its
equivalent on your operating system (see X Resources in The GNU Emacs Manual). After the frame is created, Emacs
applies any parameters listed in frame-inherited-parameters
(see below) and not present in the argument, taking the values from
the frame that was selected when make-frame was called.
Note that on multi-monitor displays (see section Multiple Terminals), the window manager might position the frame differently than specified by the positional parameters in alist (see section Position Parameters). For example, some window managers have a policy of displaying the frame on the monitor that contains the largest part of the window (a.k.a. the dominating monitor).
This function itself does not make the new frame the selected frame. See section Input Focus. The previously selected frame remains selected. On graphical terminals, however, the windowing system may select the new frame for its own reasons.
A normal hook run by make-frame before it creates the frame.
An abnormal hook run by make-frame after it creates the frame.
Each function in after-make-frame-functions receives one argument, the
frame just created.
This variable specifies the list of frame parameters that a newly
created frame inherits from the currently selected frame. For each
parameter (a symbol) that is an element in the list and is not present
in the argument to make-frame, the function sets the value of
that parameter in the created frame to its value in the selected
frame.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs represents each terminal as a terminal object data type (see section Terminal Type). On GNU and Unix systems, Emacs can use multiple terminals simultaneously in each session. On other systems, it can only use a single terminal. Each terminal object has the following attributes:
terminal-live-p (i.e., x,
t, w32, ns, or pc). See section Frames.
There is no primitive for creating terminal objects. Emacs creates
them as needed, such as when you call make-frame-on-display
(described below).
This function returns the file name of the device used by
terminal. If terminal is omitted or nil, it
defaults to the selected frame’s terminal. terminal can also be
a frame, meaning that frame’s terminal.
This function returns a list of all live terminal objects.
This function returns a terminal whose device name is given by
device. If device is a string, it can be either the file
name of a terminal device, or the name of an X display of the form
‘host:server.screen’. If device is a
frame, this function returns that frame’s terminal; nil means
the selected frame. Finally, if device is a terminal object
that represents a live terminal, that terminal is returned. The
function signals an error if its argument is none of the above.
This function deletes all frames on terminal and frees the
resources used by it. It runs the abnormal hook
delete-terminal-functions, passing terminal as the
argument to each function.
If terminal is omitted or nil, it defaults to the
selected frame’s terminal. terminal can also be a frame,
meaning that frame’s terminal.
Normally, this function signals an error if you attempt to delete the
sole active terminal, but if force is non-nil, you are
allowed to do so. Emacs automatically calls this function when the
last frame on a terminal is deleted (see section Deleting Frames).
An abnormal hook run by delete-terminal. Each function
receives one argument, the terminal argument passed to
delete-terminal. Due to technical details, the functions may
be called either just before the terminal is deleted, or just
afterwards.
A few Lisp variables are terminal-local; that is, they have a
separate binding for each terminal. The binding in effect at any time
is the one for the terminal that the currently selected frame belongs
to. These variables include default-minibuffer-frame,
defining-kbd-macro, last-kbd-macro, and
system-key-alist. They are always terminal-local, and can
never be buffer-local (see section Buffer-Local Variables).
On GNU and Unix systems, each X display is a separate graphical
terminal. When Emacs is started from within the X window system, it
uses the X display specified by the DISPLAY environment
variable, or by the ‘--display’ option (see Initial Options in The GNU Emacs Manual). Emacs can connect to other X displays
via the command make-frame-on-display. Each X display has its
own selected frame and its own minibuffer windows; however, only one
of those frames is “the selected frame” at any given moment
(see section Input Focus). Emacs can even connect to other text
terminals, by interacting with the emacsclient program.
See Emacs Server in The GNU Emacs Manual.
A single X server can handle more than one display. Each X display has a three-part name, ‘hostname:displaynumber.screennumber’. The first part, hostname, specifies the name of the machine to which the display is physically connected. The second part, displaynumber, is a zero-based number that identifies one or more monitors connected to that machine that share a common keyboard and pointing device (mouse, tablet, etc.). The third part, screennumber, identifies a zero-based screen number (a separate monitor) that is part of a single monitor collection on that X server. When you use two or more screens belonging to one server, Emacs knows by the similarity in their names that they share a single keyboard.
Systems that don’t use the X window system, such as MS-Windows, don’t support the notion of X displays, and have only one display on each host. The display name on these systems doesn’t follow the above 3-part format; for example, the display name on MS-Windows systems is a constant string ‘w32’, and exists for compatibility, so that you could pass it to functions that expect a display name.
This function creates and returns a new frame on display, taking the other frame parameters from the alist parameters. display should be the name of an X display (a string).
Before creating the frame, this function ensures that Emacs is “set
up” to display graphics. For instance, if Emacs has not processed X
resources (e.g., if it was started on a text terminal), it does so at
this time. In all other respects, this function behaves like
make-frame (see section Creating Frames).
This function returns a list that indicates which X displays Emacs has a connection to. The elements of the list are strings, and each one is a display name.
This function opens a connection to the X display display,
without creating a frame on that display. Normally, Emacs Lisp
programs need not call this function, as make-frame-on-display
calls it automatically. The only reason for calling it is to check
whether communication can be established with a given X display.
The optional argument xrm-string, if not nil, is a string
of resource names and values, in the same format used in the
.Xresources file. See X Resources in The
GNU Emacs Manual. These values apply to all Emacs frames created on
this display, overriding the resource values recorded in the X server.
Here’s an example of what this string might look like:
"*BorderWidth: 3\n*InternalBorder: 2\n"
If must-succeed is non-nil, failure to open the connection
terminates Emacs. Otherwise, it is an ordinary Lisp error.
This function closes the connection to display display. Before you can do this, you must first delete all the frames that were open on that display (see section Deleting Frames).
On some “multi-monitor” setups, a single X display outputs to more
than one physical monitor. You can use the functions
display-monitor-attributes-list and frame-monitor-attributes
to obtain information about such setups.
This function returns a list of physical monitor attributes on
display, which can be a display name (a string), a terminal, or
a frame; if omitted or nil, it defaults to the selected frame’s
display. Each element of the list is an association list,
representing the attributes of a physical monitor. The first element
corresponds to the primary monitor. The attribute keys and values
are:
Position of the top-left corner of the monitor’s screen and its size, in pixels, as ‘(x y width height)’. Note that, if the monitor is not the primary monitor, some of the coordinates might be negative.
Position of the top-left corner and size of the work area (“usable” space) in pixels as ‘(x y width height)’. This may be different from ‘geometry’ in that space occupied by various window manager features (docks, taskbars, etc.) may be excluded from the work area. Whether or not such features actually subtract from the work area depends on the platform and environment. Again, if the monitor is not the primary monitor, some of the coordinates might be negative.
Width and height in millimeters as ‘(width height)’
List of frames that this physical monitor dominates (see below).
Name of the physical monitor as string.
Source of the multi-monitor information as string; e.g., ‘XRandr’ or ‘Xinerama’.
x, y, width, and height are integers. ‘name’ and ‘source’ may be absent.
A frame is dominated by a physical monitor when either the largest area of the frame resides in that monitor, or (if the frame does not intersect any physical monitors) that monitor is the closest to the frame. Every (non-tooltip) frame (whether visible or not) in a graphical display is dominated by exactly one physical monitor at a time, though the frame can span multiple (or no) physical monitors.
Here’s an example of the data produced by this function on a 2-monitor display:
(display-monitor-attributes-list) ⇒ (((geometry 0 0 1920 1080) ;; Left-hand, primary monitor (workarea 0 0 1920 1050) ;; A taskbar occupies some of the height (mm-size 677 381) (name . "DISPLAY1") (frames #<frame emacs@host *Messages* 0x11578c0> #<frame emacs@host *scratch* 0x114b838>)) ((geometry 1920 0 1680 1050) ;; Right-hand monitor (workarea 1920 0 1680 1050) ;; Whole screen can be used (mm-size 593 370) (name . "DISPLAY2") (frames)))
This function returns the attributes of the physical monitor dominating (see above) frame, which defaults to the selected frame.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A frame has many parameters that control its appearance and behavior. Just what parameters a frame has depends on what display mechanism it uses.
Frame parameters exist mostly for the sake of graphical displays.
Most frame parameters have no effect when applied to a frame on a text
terminal; only the height, width, name,
title, menu-bar-lines, buffer-list and
buffer-predicate parameters do something special. If the
terminal supports colors, the parameters foreground-color,
background-color, background-mode and
display-type are also meaningful. If the terminal supports
frame transparency, the parameter alpha is also meaningful.
| 28.3.1 Access to Frame Parameters | How to change a frame’s parameters. | |
| 28.3.2 Initial Frame Parameters | Specifying frame parameters when you make a frame. | |
| 28.3.3 Window Frame Parameters | List of frame parameters for window systems. | |
| 28.3.4 Frame Size And Position | Changing the size and position of a frame. | |
| 28.3.5 Geometry | Parsing geometry specifications. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These functions let you read and change the parameter values of a frame.
This function returns the value of the parameter parameter (a
symbol) of frame. If frame is nil, it returns the
selected frame’s parameter. If frame has no setting for
parameter, this function returns nil.
The function frame-parameters returns an alist listing all the
parameters of frame and their values. If frame is
nil or omitted, this returns the selected frame’s parameters
This function alters the parameters of frame frame based on the
elements of alist. Each element of alist has the form
(parm . value), where parm is a symbol naming a
parameter. If you don’t mention a parameter in alist, its value
doesn’t change. If frame is nil, it defaults to the selected
frame.
This function sets the frame parameter parm to the specified
value. If frame is nil, it defaults to the
selected frame.
This function alters the frame parameters of all existing frames
according to alist, then modifies default-frame-alist
(and, if necessary, initial-frame-alist) to apply the same
parameter values to frames that will be created henceforth.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can specify the parameters for the initial startup frame by
setting initial-frame-alist in your init file (see section The Init File).
This variable’s value is an alist of parameter values used when creating the initial frame. You can set this variable to specify the appearance of the initial frame without altering subsequent frames. Each element has the form:
(parameter . value)
Emacs creates the initial frame before it reads your init
file. After reading that file, Emacs checks initial-frame-alist,
and applies the parameter settings in the altered value to the already
created initial frame.
If these settings affect the frame geometry and appearance, you’ll see the frame appear with the wrong ones and then change to the specified ones. If that bothers you, you can specify the same geometry and appearance with X resources; those do take effect before the frame is created. See X Resources in The GNU Emacs Manual.
X resource settings typically apply to all frames. If you want to
specify some X resources solely for the sake of the initial frame, and
you don’t want them to apply to subsequent frames, here’s how to achieve
this. Specify parameters in default-frame-alist to override the
X resources for subsequent frames; then, to prevent these from affecting
the initial frame, specify the same parameters in
initial-frame-alist with values that match the X resources.
If these parameters include (minibuffer . nil), that indicates
that the initial frame should have no minibuffer. In this case, Emacs
creates a separate minibuffer-only frame as well.
This variable’s value is an alist of parameter values used when
creating an initial minibuffer-only frame (i.e., the minibuffer-only
frame that Emacs creates if initial-frame-alist specifies a
frame with no minibuffer).
This is an alist specifying default values of frame parameters for all Emacs frames—the first frame, and subsequent frames. When using the X Window System, you can get the same results by means of X resources in many cases.
Setting this variable does not affect existing frames. Furthermore, functions that display a buffer in a separate frame may override the default parameters by supplying their own parameters.
If you invoke Emacs with command-line options that specify frame
appearance, those options take effect by adding elements to either
initial-frame-alist or default-frame-alist. Options
which affect just the initial frame, such as ‘--geometry’ and
‘--maximized’, add to initial-frame-alist; the others add
to default-frame-alist. see Command Line
Arguments for Emacs Invocation in The GNU Emacs Manual.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Just what parameters a frame has depends on what display mechanism
it uses. This section describes the parameters that have special
meanings on some or all kinds of terminals. Of these, name,
title, height, width, buffer-list and
buffer-predicate provide meaningful information in terminal
frames, and tty-color-mode is meaningful only for frames on
text terminals.
| 28.3.3.1 Basic Parameters | Parameters that are fundamental. | |
| 28.3.3.2 Position Parameters | The position of the frame on the screen. | |
| 28.3.3.3 Size Parameters | Frame’s size. | |
| 28.3.3.4 Layout Parameters | Size of parts of the frame, and enabling or disabling some parts. | |
| 28.3.3.5 Buffer Parameters | Which buffers have been or should be shown. | |
| 28.3.3.6 Window Management Parameters | Communicating with the window manager. | |
| 28.3.3.7 Cursor Parameters | Controlling the cursor appearance. | |
| 28.3.3.8 Font and Color Parameters | Fonts and colors for the frame text. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These frame parameters give the most basic information about the
frame. title and name are meaningful on all terminals.
displayThe display on which to open this frame. It should be a string of the
form ‘host:dpy.screen’, just like the
DISPLAY environment variable. See section Multiple Terminals, for
more details about display names.
display-typeThis parameter describes the range of possible colors that can be used
in this frame. Its value is color, grayscale or
mono.
titleIf a frame has a non-nil title, it appears in the window
system’s title bar at the top of the frame, and also in the mode line
of windows in that frame if mode-line-frame-identification uses
‘%F’ (see section %-Constructs in the Mode Line). This is normally the case when
Emacs is not using a window system, and can only display one frame at
a time. See section Frame Titles.
nameThe name of the frame. The frame name serves as a default for the frame
title, if the title parameter is unspecified or nil. If
you don’t specify a name, Emacs sets the frame name automatically
(see section Frame Titles).
If you specify the frame name explicitly when you create the frame, the name is also used (instead of the name of the Emacs executable) when looking up X resources for the frame.
explicit-nameIf the frame name was specified explicitly when the frame was created,
this parameter will be that name. If the frame wasn’t explicitly
named, this parameter will be nil.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Position parameters’ values are normally measured in pixels, but on text terminals they count characters or lines instead.
leftThe position, in pixels, of the left (or right) edge of the frame with respect to the left (or right) edge of the screen. The value may be:
A positive integer relates the left edge of the frame to the left edge of the screen. A negative integer relates the right frame edge to the right screen edge.
(+ pos)This specifies the position of the left frame edge relative to the left screen edge. The integer pos may be positive or negative; a negative value specifies a position outside the screen or on a monitor other than the primary one (for multi-monitor displays).
(- pos)This specifies the position of the right frame edge relative to the right screen edge. The integer pos may be positive or negative; a negative value specifies a position outside the screen or on a monitor other than the primary one (for multi-monitor displays).
Some window managers ignore program-specified positions. If you want to
be sure the position you specify is not ignored, specify a
non-nil value for the user-position parameter as well.
topThe screen position of the top (or bottom) edge, in pixels, with respect
to the top (or bottom) edge of the screen. It works just like
left, except vertically instead of horizontally.
icon-leftThe screen position of the left edge of the frame’s icon, in pixels,
counting from the left edge of the screen. This takes effect when the
frame is iconified, if the window manager supports this feature. If
you specify a value for this parameter, then you must also specify a
value for icon-top and vice versa.
icon-topThe screen position of the top edge of the frame’s icon, in pixels, counting from the top edge of the screen. This takes effect when the frame is iconified, if the window manager supports this feature.
user-positionWhen you create a frame and specify its screen position with the
left and top parameters, use this parameter to say whether
the specified position was user-specified (explicitly requested in some
way by a human user) or merely program-specified (chosen by a program).
A non-nil value says the position was user-specified.
Window managers generally heed user-specified positions, and some heed
program-specified positions too. But many ignore program-specified
positions, placing the window in a default fashion or letting the user
place it with the mouse. Some window managers, including twm,
let the user specify whether to obey program-specified positions or
ignore them.
When you call make-frame, you should specify a non-nil
value for this parameter if the values of the left and top
parameters represent the user’s stated preference; otherwise, use
nil.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Frame parameters specify frame sizes in character units. On
graphical displays, the default face determines the actual
pixel sizes of these character units (see section Face Attributes).
heightThe height of the frame contents, in characters. (To get the height in
pixels, call frame-pixel-height; see Frame Size And Position.)
widthThe width of the frame contents, in characters. (To get the width in
pixels, call frame-pixel-width; see Frame Size And Position.)
user-sizeThis does for the size parameters height and width what
the user-position parameter (see section user-position) does for the position parameters top and
left.
fullscreenSpecify that width, height or both shall be maximized. The value
fullwidth specifies that width shall be as wide as possible.
The value fullheight specifies that height shall be as tall as
possible. The value fullboth specifies that both the width and
the height shall be set to the size of the screen. The value
maximized specifies that the frame shall be maximized. The
difference between maximized and fullboth is that the
former can still be resized by dragging window manager decorations
with the mouse, while the latter really covers the whole screen and
does not allow resizing by mouse dragging.
With some window managers you may have to customize the variable
frame-resize-pixelwise to a non-nil value in order to make
a frame appear “maximized” or “fullscreen”.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These frame parameters enable or disable various parts of the frame, or control their sizes.
border-widthThe width in pixels of the frame’s border.
internal-border-widthThe distance in pixels between text (or fringe) and the frame’s border.
vertical-scroll-barsWhether the frame has scroll bars for vertical scrolling, and which side
of the frame they should be on. The possible values are left,
right, and nil for no scroll bars.
scroll-bar-widthThe width of vertical scroll bars, in pixels, or nil meaning to
use the default width.
left-fringeright-fringeThe default width of the left and right fringes of windows in this frame (see section Fringes). If either of these is zero, that effectively removes the corresponding fringe.
When you use frame-parameter to query the value of either of
these two frame parameters, the return value is always an integer.
When using set-frame-parameter, passing a nil value
imposes an actual default value of 8 pixels.
The combined fringe widths must add up to an integral number of
columns, so the actual default fringe widths for the frame, as
reported by frame-parameter, may be larger than what you
specify. Any extra width is distributed evenly between the left and
right fringe. However, you can force one fringe or the other to a
precise width by specifying that width as a negative integer. If both
widths are negative, only the left fringe gets the specified width.
right-divider-widthThe width (thickness) reserved for the right divider (see section Window Dividers) of any window on the frame, in pixels. A value of zero means to not draw right dividers.
bottom-divider-widthThe width (thickness) reserved for the bottom divider (see section Window Dividers) of any window on the frame, in pixels. A value of zero means to not draw bottom dividers.
menu-bar-linesThe number of lines to allocate at the top of the frame for a menu bar. The default is 1 if Menu Bar mode is enabled, and 0 otherwise. See Menu Bars in The GNU Emacs Manual.
tool-bar-linesThe number of lines to use for the tool bar. The default is 1 if Tool Bar mode is enabled, and 0 otherwise. See Tool Bars in The GNU Emacs Manual.
tool-bar-positionThe position of the tool bar. Currently only for the GTK tool bar.
Value can be one of top, bottom left, right.
The default is top.
line-spacingAdditional space to leave below each text line, in pixels (a positive integer). See section Line Height, for more information.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These frame parameters, meaningful on all kinds of terminals, deal with which buffers have been, or should, be displayed in the frame.
minibufferWhether this frame has its own minibuffer. The value t means
yes, nil means no, only means this frame is just a
minibuffer. If the value is a minibuffer window (in some other
frame), the frame uses that minibuffer.
This frame parameter takes effect when the frame is created, and can not be changed afterwards.
buffer-predicateThe buffer-predicate function for this frame. The function
other-buffer uses this predicate (from the selected frame) to
decide which buffers it should consider, if the predicate is not
nil. It calls the predicate with one argument, a buffer, once for
each buffer; if the predicate returns a non-nil value, it
considers that buffer.
buffer-listA list of buffers that have been selected in this frame, ordered most-recently-selected first.
unsplittableIf non-nil, this frame’s window is never split automatically.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The following frame parameters control various aspects of the frame’s interaction with the window manager. They have no effect on text terminals.
visibilityThe state of visibility of the frame. There are three possibilities:
nil for invisible, t for visible, and icon for
iconified. See section Visibility of Frames.
auto-raiseIf non-nil, Emacs automatically raises the frame when it is
selected. Some window managers do not allow this.
auto-lowerIf non-nil, Emacs automatically lowers the frame when it is
deselected. Some window managers do not allow this.
icon-typeThe type of icon to use for this frame. If the value is a string,
that specifies a file containing a bitmap to use; nil specifies
no icon (in which case the window manager decides what to show); any
other non-nil value specifies the default Emacs icon.
icon-nameThe name to use in the icon for this frame, when and if the icon
appears. If this is nil, the frame’s title is used.
window-idThe ID number which the graphical display uses for this frame. Emacs assigns this parameter when the frame is created; changing the parameter has no effect on the actual ID number.
outer-window-idThe ID number of the outermost window-system window in which the frame
exists. As with window-id, changing this parameter has no
actual effect.
wait-for-wmIf non-nil, tell Xt to wait for the window manager to confirm
geometry changes. Some window managers, including versions of Fvwm2
and KDE, fail to confirm, so Xt hangs. Set this to nil to
prevent hanging with those window managers.
stickyIf non-nil, the frame is visible on all virtual desktops on systems
with virtual desktops.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This frame parameter controls the way the cursor looks.
cursor-typeHow to display the cursor. Legitimate values are:
boxDisplay a filled box. (This is the default.)
hollowDisplay a hollow box.
nilDon’t display a cursor.
barDisplay a vertical bar between characters.
(bar . width)Display a vertical bar width pixels wide between characters.
hbarDisplay a horizontal bar.
(hbar . height)Display a horizontal bar height pixels high.
The cursor-type frame parameter may be overridden by the
variables cursor-type and
cursor-in-non-selected-windows:
This buffer-local variable controls how the cursor looks in a selected
window showing the buffer. If its value is t, that means to
use the cursor specified by the cursor-type frame parameter.
Otherwise, the value should be one of the cursor types listed above,
and it overrides the cursor-type frame parameter.
This buffer-local variable controls how the cursor looks in a window
that is not selected. It supports the same values as the
cursor-type frame parameter; also, nil means don’t
display a cursor in nonselected windows, and t (the default)
means use a standard modification of the usual cursor type (solid box
becomes hollow box, and bar becomes a narrower bar).
This variable specifies how to blink the cursor. Each element has the
form (on-state . off-state). Whenever the cursor
type equals on-state (comparing using equal), the
corresponding off-state specifies what the cursor looks like
when it blinks “off”. Both on-state and off-state
should be suitable values for the cursor-type frame parameter.
There are various defaults for how to blink each type of cursor, if
the type is not mentioned as an on-state here. Changes in this
variable do not take effect immediately, only when you specify the
cursor-type frame parameter.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These frame parameters control the use of fonts and colors.
font-backendA list of symbols, specifying the font backends to use for
drawing fonts in the frame, in order of priority. On X, there are
currently two available font backends: x (the X core font
driver) and xft (the Xft font driver). On MS-Windows, there are
currently two available font backends: gdi and
uniscribe (see Windows Fonts in The GNU Emacs
Manual). On other systems, there is only one available font backend,
so it does not make sense to modify this frame parameter.
background-modeThis parameter is either dark or light, according
to whether the background color is a light one or a dark one.
tty-color-modeThis parameter overrides the terminal’s color support as given by the
system’s terminal capabilities database in that this parameter’s value
specifies the color mode to use on a text terminal. The value can be
either a symbol or a number. A number specifies the number of colors
to use (and, indirectly, what commands to issue to produce each
color). For example, (tty-color-mode . 8) specifies use of the
ANSI escape sequences for 8 standard text colors. A value of -1 turns
off color support.
If the parameter’s value is a symbol, it specifies a number through
the value of tty-color-mode-alist, and the associated number is
used instead.
screen-gammaIf this is a number, Emacs performs “gamma correction” which adjusts the brightness of all colors. The value should be the screen gamma of your display.
Usual PC monitors have a screen gamma of 2.2, so color values in
Emacs, and in X windows generally, are calibrated to display properly
on a monitor with that gamma value. If you specify 2.2 for
screen-gamma, that means no correction is needed. Other values
request correction, designed to make the corrected colors appear on
your screen the way they would have appeared without correction on an
ordinary monitor with a gamma value of 2.2.
If your monitor displays colors too light, you should specify a
screen-gamma value smaller than 2.2. This requests correction
that makes colors darker. A screen gamma value of 1.5 may give good
results for LCD color displays.
alphaThis parameter specifies the opacity of the frame, on graphical
displays that support variable opacity. It should be an integer
between 0 and 100, where 0 means completely transparent and 100 means
completely opaque. It can also have a nil value, which tells
Emacs not to set the frame opacity (leaving it to the window manager).
To prevent the frame from disappearing completely from view, the
variable frame-alpha-lower-limit defines a lower opacity limit.
If the value of the frame parameter is less than the value of this
variable, Emacs uses the latter. By default,
frame-alpha-lower-limit is 20.
The alpha frame parameter can also be a cons cell
(‘active’ . ‘inactive’), where ‘active’ is the
opacity of the frame when it is selected, and ‘inactive’ is the
opacity when it is not selected.
The following frame parameters are semi-obsolete in that they are automatically equivalent to particular face attributes of particular faces (see Standard Faces in The Emacs Manual):
fontThe name of the font for displaying text in the frame. This is a
string, either a valid font name for your system or the name of an Emacs
fontset (see section Fontsets). It is equivalent to the font
attribute of the default face.
foreground-colorThe color to use for the image of a character. It is equivalent to
the :foreground attribute of the default face.
background-colorThe color to use for the background of characters. It is equivalent to
the :background attribute of the default face.
mouse-colorThe color for the mouse pointer. It is equivalent to the :background
attribute of the mouse face.
cursor-colorThe color for the cursor that shows point. It is equivalent to the
:background attribute of the cursor face.
border-colorThe color for the border of the frame. It is equivalent to the
:background attribute of the border face.
scroll-bar-foregroundIf non-nil, the color for the foreground of scroll bars. It is
equivalent to the :foreground attribute of the
scroll-bar face.
scroll-bar-backgroundIf non-nil, the color for the background of scroll bars. It is
equivalent to the :background attribute of the
scroll-bar face.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can read or change the size and position of a frame using the
frame parameters left, top, height, and
width. Whatever geometry parameters you don’t specify are chosen
by the window manager in its usual fashion.
Here are some special features for working with sizes and positions. (For the precise meaning of “selected frame” used by these functions, see Input Focus.)
This function sets the position of the top left corner of frame to left and top. These arguments are measured in pixels, and normally count from the top left corner of the screen.
Negative parameter values position the bottom edge of the window up from the bottom edge of the screen, or the right window edge to the left of the right edge of the screen. It would probably be better if the values were always counted from the left and top, so that negative arguments would position the frame partly off the top or left edge of the screen, but it seems inadvisable to change that now.
These functions return the height and width of frame, measured in lines and columns. If you don’t supply frame, they use the selected frame.
These functions return the height and width of the main display area of frame, measured in pixels. If you don’t supply frame, they use the selected frame. For a text terminal, the results are in characters rather than pixels.
These values include the internal borders, and windows’ scroll bars and fringes (which belong to individual windows, not to the frame itself). The exact value of the heights depends on the window-system and toolkit in use. With GTK+, the height does not include any tool bar or menu bar. With the Motif or Lucid toolkits, it includes the tool bar but not the menu bar. In a graphical version with no toolkit, it includes both the tool bar and menu bar. For a text terminal, the result includes the menu bar.
These functions return the height and width of a character in frame, measured in pixels. The values depend on the choice of font. If you don’t supply frame, these functions use the selected frame.
If this option is nil, a frame’s size is usually rounded to a
multiple of the current values of that frame’s frame-char-height
and frame-char-width. If this is non-nil, no rounding
occurs, hence frame sizes can increase/decrease by one pixel.
Setting this causes the next resize operation to pass the corresponding size hints to the window manager. This means that this variable should be set only in a user’s initial file; applications should never bind it temporarily.
The precise meaning of a value of nil for this option depends
on the toolkit used. Dragging the frame border with the mouse is usually
done character-wise. Calling set-frame-size (see below)
with arguments that do not specify the frame size as an integer multiple
of its character size, however, may: be ignored, cause a
rounding (GTK+), or be accepted (Lucid, Motif, MS-Windows).
With some window managers you may have to set this to non-nil in
order to make a frame appear truly “maximized” or “fullscreen”.
This function sets the size of frame, measured in characters; width and height specify the new width in columns and the new height in lines.
The optional argument pixelwise non-nil means to measure
the new width and height in units of pixels instead. Note that if
frame-resize-pixelwise is nil, some toolkits may refuse to
fully honor the request if it does not increase/decrease the frame size
to a multiple of its character size.
This function resizes frame to a height of height lines. The sizes of existing windows in frame are altered proportionally to fit.
If pretend is non-nil, then Emacs displays height
lines of output in frame, but does not change its value for the
actual height of the frame. This is only useful on text terminals.
Using a smaller height than the terminal actually implements may be
useful to reproduce behavior observed on a smaller screen, or if the
terminal malfunctions when using its whole screen. Setting the frame
height “for real” does not always work, because knowing the correct
actual size may be necessary for correct cursor positioning on
text terminals.
The optional fourth argument pixelwise non-nil means that
frame should be height pixels high. Note that if
frame-resize-pixelwise is nil, some toolkits may refuse to
fully honor the request if it does not increase/decrease the frame
height to a multiple of its character height.
This function sets the width of frame, measured in characters.
The argument pretend has the same meaning as in
set-frame-height.
The optional fourth argument pixelwise non-nil means that
frame should be width pixels wide. Note that if
frame-resize-pixelwise is nil, some toolkits may refuse to
fully honor the request if it does not increase/decrease the frame width
to a multiple of its character width.
If you have a frame that displays only one window, you can fit that
frame to its buffer using the command fit-frame-to-buffer.
This command adjusts the size of frame to display the contents of
its buffer exactly. frame can be any live frame and defaults to
the selected one. Fitting is done only if frame’s root window is
live. The arguments max-height, min-height, max-width
and min-width specify bounds on the new total size of
frame’s root window. min-height and min-width default
to the values of window-min-height and window-min-width
respectively.
If the optional argument only is vertically, this function
may resize the frame vertically only. If only is
horizontally, it may resize the frame horizontally only.
The behavior of fit-frame-to-buffer can be controlled with the
help of the two options listed next.
This option can be used to specify margins around frames to be fit by
fit-frame-to-buffer. Such margins can be useful to avoid, for
example, that such frames overlap the taskbar.
It specifies the numbers of pixels to be left free on the left, above,
the right, and below a frame that shall be fit. The default specifies
nil for each which means to use no margins. The value specified
here can be overridden for a specific frame by that frame’s
fit-frame-to-buffer-margins parameter, if present.
This option specifies size boundaries for fit-frame-to-buffer.
It specifies the total maximum and minimum lines and maximum and minimum
columns of the root window of any frame that shall be fit to its buffer.
If any of these values is non-nil, it overrides the corresponding
argument of fit-frame-to-buffer.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here’s how to examine the data in an X-style window geometry specification:
The function x-parse-geometry converts a standard X window
geometry string to an alist that you can use as part of the argument to
make-frame.
The alist describes which parameters were specified in geom, and
gives the values specified for them. Each element looks like
(parameter . value). The possible parameter
values are left, top, width, and height.
For the size parameters, the value must be an integer. The position
parameter names left and top are not totally accurate,
because some values indicate the position of the right or bottom edges
instead. The value possibilities for the position parameters are:
an integer, a list (+ pos), or a list (- pos);
as previously described (see section Position Parameters).
Here is an example:
(x-parse-geometry "35x70+0-0")
⇒ ((height . 70) (width . 35)
(top - 0) (left . 0))
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Each terminal has a list of associated parameters. These terminal parameters are mostly a convenient way of storage for terminal-local variables, but some terminal parameters have a special meaning.
This section describes functions to read and change the parameter values
of a terminal. They all accept as their argument either a terminal or
a frame; the latter means use that frame’s terminal. An argument of
nil means the selected frame’s terminal.
This function returns an alist listing all the parameters of terminal and their values.
This function returns the value of the parameter parameter (a
symbol) of terminal. If terminal has no setting for
parameter, this function returns nil.
This function sets the parameter parm of terminal to the specified value, and returns the previous value of that parameter.
Here’s a list of a few terminal parameters that have a special meaning:
background-modeThe classification of the terminal’s background color, either
light or dark.
normal-erase-is-backspaceValue is either 1 or 0, depending on whether
normal-erase-is-backspace-mode is turned on or off on this
terminal. See DEL Does Not Delete in The Emacs Manual.
terminal-inittedAfter the terminal is initialized, this is set to the terminal-specific initialization function.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Every frame has a name parameter; this serves as the default
for the frame title which window systems typically display at the top of
the frame. You can specify a name explicitly by setting the name
frame property.
Normally you don’t specify the name explicitly, and Emacs computes the
frame name automatically based on a template stored in the variable
frame-title-format. Emacs recomputes the name each time the
frame is redisplayed.
This variable specifies how to compute a name for a frame when you have
not explicitly specified one. The variable’s value is actually a mode
line construct, just like mode-line-format, except that the
‘%c’ and ‘%l’ constructs are ignored. See section The Data Structure of the Mode Line.
This variable specifies how to compute the name for an iconified frame, when you have not explicitly specified the frame title. This title appears in the icon itself.
This variable is set automatically by Emacs. Its value is t when
there are two or more frames (not counting minibuffer-only frames or
invisible frames). The default value of frame-title-format uses
multiple-frames so as to put the buffer name in the frame title
only when there is more than one frame.
The value of this variable is not guaranteed to be accurate except
while processing frame-title-format or
icon-title-format.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A live frame is one that has not been deleted. When a frame is deleted, it is removed from its terminal display, although it may continue to exist as a Lisp object until there are no more references to it.
This function deletes the frame frame. Unless frame is a
tooltip, it first runs the hook delete-frame-functions (each
function gets one argument, frame). By default, frame is
the selected frame.
A frame cannot be deleted if its minibuffer is used by other frames.
Normally, you cannot delete a frame if all other frames are invisible,
but if force is non-nil, then you are allowed to do so.
The function frame-live-p returns non-nil if the frame
frame has not been deleted. The possible non-nil return
values are like those of framep. See section Frames.
Some window managers provide a command to delete a window. These work
by sending a special message to the program that operates the window.
When Emacs gets one of these commands, it generates a
delete-frame event, whose normal definition is a command that
calls the function delete-frame. See section Miscellaneous System Events.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This function returns a list of all the live frames, i.e., those that
have not been deleted. It is analogous to buffer-list for
buffers, and includes frames on all terminals. The list that you get
is newly created, so modifying the list doesn’t have any effect on the
internals of Emacs.
This function returns a list of just the currently visible frames. See section Visibility of Frames. Frames on text terminals always count as “visible”, even though only the selected one is actually displayed.
This function lets you cycle conveniently through all the frames on
the current display from an arbitrary starting point. It returns the
“next” frame after frame in the cycle. If frame is
omitted or nil, it defaults to the selected frame (see section Input Focus).
The second argument, minibuf, says which frames to consider:
nilExclude minibuffer-only frames.
visibleConsider all visible frames.
Consider all visible or iconified frames.
Consider only the frames using that particular window as their minibuffer.
Consider all frames.
Like next-frame, but cycles through all frames in the opposite
direction.
See also next-window and previous-window, in Cyclic Ordering of Windows.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Normally, each frame has its own minibuffer window at the bottom, which
is used whenever that frame is selected. If the frame has a minibuffer,
you can get it with minibuffer-window (see Definition of minibuffer-window).
However, you can also create a frame with no minibuffer. Such a frame
must use the minibuffer window of some other frame. When you create the
frame, you can explicitly specify the minibuffer window to use (in some
other frame). If you don’t, then the minibuffer is found in the frame
which is the value of the variable default-minibuffer-frame. Its
value should be a frame that does have a minibuffer.
If you use a minibuffer-only frame, you might want that frame to raise
when you enter the minibuffer. If so, set the variable
minibuffer-auto-raise to t. See section Raising and Lowering Frames.
This variable specifies the frame to use for the minibuffer window, by default. It does not affect existing frames. It is always local to the current terminal and cannot be buffer-local. See section Multiple Terminals.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
At any time, one frame in Emacs is the selected frame. The selected window always resides on the selected frame.
When Emacs displays its frames on several terminals (see section Multiple Terminals), each terminal has its own selected frame. But only one of these is “the selected frame”: it’s the frame that belongs to the terminal from which the most recent input came. That is, when Emacs runs a command that came from a certain terminal, the selected frame is the one of that terminal. Since Emacs runs only a single command at any given time, it needs to consider only one selected frame at a time; this frame is what we call the selected frame in this manual. The display on which the selected frame is shown is the selected frame’s display.
This function returns the selected frame.
Some window systems and window managers direct keyboard input to the
window object that the mouse is in; others require explicit clicks or
commands to shift the focus to various window objects. Either
way, Emacs automatically keeps track of which frame has the focus. To
explicitly switch to a different frame from a Lisp function, call
select-frame-set-input-focus.
Lisp programs can also switch frames “temporarily” by calling the
function select-frame. This does not alter the window system’s
concept of focus; rather, it escapes from the window manager’s control
until that control is somehow reasserted.
When using a text terminal, only one frame can be displayed at a time
on the terminal, so after a call to select-frame, the next
redisplay actually displays the newly selected frame. This frame
remains selected until a subsequent call to select-frame. Each
frame on a text terminal has a number which appears in the mode line
before the buffer name (see section Variables Used in the Mode Line).
This function selects frame, raises it (should it happen to be
obscured by other frames) and tries to give it the X server’s focus.
On a text terminal, the next redisplay displays the new frame on the
entire terminal screen. The optional argument norecord has the
same meaning as for select-frame (see below). The return value
of this function is not significant.
This function selects frame frame, temporarily disregarding the focus of the X server if any. The selection of frame lasts until the next time the user does something to select a different frame, or until the next time this function is called. (If you are using a window system, the previously selected frame may be restored as the selected frame after return to the command loop, because it still may have the window system’s input focus.)
The specified frame becomes the selected frame, and its terminal
becomes the selected terminal. This function then calls
select-window as a subroutine, passing the window selected
within frame as its first argument and norecord as its
second argument (hence, if norecord is non-nil, this
avoids changing the order of recently selected windows nor the buffer
list). See section Selecting Windows.
This function returns frame, or nil if frame has
been deleted.
In general, you should never use select-frame in a way that
could switch to a different terminal without switching back when
you’re done.
Emacs cooperates with the window system by arranging to select frames as
the server and window manager request. It does so by generating a
special kind of input event, called a focus event, when
appropriate. The command loop handles a focus event by calling
handle-switch-frame. See section Focus Events.
This function handles a focus event by selecting frame frame.
Focus events normally do their job by invoking this command. Don’t call it for any other reason.
This function redirects focus from frame to focus-frame.
This means that focus-frame will receive subsequent keystrokes and
events intended for frame. After such an event, the value of
last-event-frame will be focus-frame. Also, switch-frame
events specifying frame will instead select focus-frame.
If focus-frame is omitted or nil, that cancels any existing
redirection for frame, which therefore once again receives its own
events.
One use of focus redirection is for frames that don’t have minibuffers. These frames use minibuffers on other frames. Activating a minibuffer on another frame redirects focus to that frame. This puts the focus on the minibuffer’s frame, where it belongs, even though the mouse remains in the frame that activated the minibuffer.
Selecting a frame can also change focus redirections. Selecting frame
bar, when foo had been selected, changes any redirections
pointing to foo so that they point to bar instead. This
allows focus redirection to work properly when the user switches from
one frame to another using select-window.
This means that a frame whose focus is redirected to itself is treated
differently from a frame whose focus is not redirected.
select-frame affects the former but not the latter.
The redirection lasts until redirect-frame-focus is called to
change it.
This is a normal hook run when an Emacs frame gains input focus.
This is a normal hook run when an Emacs frame loses input focus.
This option is how you inform Emacs whether the window manager transfers
focus when the user moves the mouse. Non-nil says that it does.
When this is so, the command other-frame moves the mouse to a
position consistent with the new selected frame.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A frame on a graphical display may be visible, invisible, or iconified. If it is visible, its contents are displayed in the usual manner. If it is iconified, its contents are not displayed, but there is a little icon somewhere to bring the frame back into view (some window managers refer to this state as minimized rather than iconified, but from Emacs’ point of view they are the same thing). If a frame is invisible, it is not displayed at all.
Visibility is meaningless on text terminals, since only the selected one is actually displayed in any case.
This function returns the visibility status of frame frame. The
value is t if frame is visible, nil if it is
invisible, and icon if it is iconified.
On a text terminal, all frames are considered “visible” for the purposes of this function, even though only one frame is displayed. See section Raising and Lowering Frames.
This function iconifies frame frame. If you omit frame, it iconifies the selected frame.
This function makes frame frame visible. If you omit
frame, it makes the selected frame visible. This does not raise
the frame, but you can do that with raise-frame if you wish
(see section Raising and Lowering Frames).
This function makes frame frame invisible. If you omit frame, it makes the selected frame invisible.
Unless force is non-nil, this function refuses to make
frame invisible if all other frames are invisible..
The visibility status of a frame is also available as a frame parameter. You can read or change it as such. See section Window Management Parameters. The user can also iconify and deiconify frames with the window manager. This happens below the level at which Emacs can exert any control, but Emacs does provide events that you can use to keep track of such changes. See section Miscellaneous System Events.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Most window systems use a desktop metaphor. Part of this metaphor
is the idea that system-level windows (e.g., Emacs frames) are
stacked in a notional third dimension perpendicular to the screen
surface. Where two overlap, the one higher up covers the one
underneath. You can raise or lower a frame using the
functions raise-frame and lower-frame.
This function raises frame frame (default, the selected frame). If frame is invisible or iconified, this makes it visible.
This function lowers frame frame (default, the selected frame).
If this is non-nil, activation of the minibuffer raises the frame
that the minibuffer window is in.
On window systems, you can also enable auto-raising (on frame selection) or auto-lowering (on frame deselection) using frame parameters. See section Window Management Parameters.
The concept of raising and lowering frames also applies to text terminal frames. On each text terminal, only the top frame is displayed at any one time.
This function returns the top frame on terminal. terminal
should be a terminal object, a frame (meaning that frame’s terminal),
or nil (meaning the selected frame’s terminal). If it does not
refer to a text terminal, the return value is nil.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A frame configuration records the current arrangement of frames, all their properties, and the window configuration of each one. (See section Window Configurations.)
This function returns a frame configuration list that describes the current arrangement of frames and their contents.
This function restores the state of frames described in configuration. However, this function does not restore deleted frames.
Ordinarily, this function deletes all existing frames not listed in
configuration. But if nodelete is non-nil, the
unwanted frames are iconified instead.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Sometimes it is useful to track the mouse, which means to display something to indicate where the mouse is and move the indicator as the mouse moves. For efficient mouse tracking, you need a way to wait until the mouse actually moves.
The convenient way to track the mouse is to ask for events to represent mouse motion. Then you can wait for motion by waiting for an event. In addition, you can easily handle any other sorts of events that may occur. That is useful, because normally you don’t want to track the mouse forever—only until some other event, such as the release of a button.
This special form executes body, with generation of mouse motion
events enabled. Typically, body would use read-event to
read the motion events and modify the display accordingly. See section Motion Events, for the format of mouse motion events.
The value of track-mouse is that of the last form in body.
You should design body to return when it sees the up-event that
indicates the release of the button, or whatever kind of event means
it is time to stop tracking.
The usual purpose of tracking mouse motion is to indicate on the screen the consequences of pushing or releasing a button at the current position.
In many cases, you can avoid the need to track the mouse by using
the mouse-face text property (see section Properties with Special Meanings).
That works at a much lower level and runs more smoothly than
Lisp-level mouse tracking.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The functions mouse-position and set-mouse-position
give access to the current position of the mouse.
This function returns a description of the position of the mouse. The
value looks like (frame x . y), where x
and y are integers giving the position in characters relative to
the top left corner of the inside of frame.
If non-nil, the value of this variable is a function for
mouse-position to call. mouse-position calls this
function just before returning, with its normal return value as the
sole argument, and it returns whatever this function returns to it.
This abnormal hook exists for the benefit of packages like xt-mouse.el that need to do mouse handling at the Lisp level.
This function warps the mouse to position x, y in frame frame. The arguments x and y are integers, giving the position in characters relative to the top left corner of the inside of frame. If frame is not visible, this function does nothing. The return value is not significant.
This function is like mouse-position except that it returns
coordinates in units of pixels rather than units of characters.
This function warps the mouse like set-mouse-position except that
x and y are in units of pixels rather than units of
characters. These coordinates are not required to be within the frame.
If frame is not visible, this function does nothing. The return value is not significant.
This predicate function returns non-nil if the mouse pointer
displayed on frame is visible; otherwise it returns nil.
frame omitted or nil means the selected frame. This is
useful when make-pointer-invisible is set to t: it
allows to know if the pointer has been hidden.
See Mouse Avoidance in The Emacs Manual.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A Lisp program can pop up a menu so that the user can choose an alternative with the mouse. On a text terminal, if the mouse is not available, the user can choose an alternative using the keyboard motion keys—C-n, C-p, or up- and down-arrow keys.
This function displays a pop-up menu and returns an indication of what selection the user makes.
The argument position specifies where on the screen to put the top left corner of the menu. It can be either a mouse button event (which says to put the menu where the user actuated the button) or a list of this form:
((xoffset yoffset) window)
where xoffset and yoffset are coordinates, measured in pixels, counting from the top left corner of window. window may be a window or a frame.
If position is t, it means to use the current mouse
position (or the top-left corner of the frame if the mouse is not
available on a text terminal). If position is nil, it
means to precompute the key binding equivalents for the keymaps
specified in menu, without actually displaying or popping up the
menu.
The argument menu says what to display in the menu. It can be a
keymap or a list of keymaps (see section Menu Keymaps). In this case, the
return value is the list of events corresponding to the user’s choice.
This list has more than one element if the choice occurred in a
submenu. (Note that x-popup-menu does not actually execute the
command bound to that sequence of events.) On text terminals and
toolkits that support menu titles, the title is taken from the prompt
string of menu if menu is a keymap, or from the prompt
string of the first keymap in menu if it is a list of keymaps
(see section Defining Menus).
Alternatively, menu can have the following form:
(title pane1 pane2...)
where each pane is a list of form
(title item1 item2...)
Each item should be a cons cell, (line . value),
where line is a string and value is the value to return if
that line is chosen. Unlike in a menu keymap, a nil
value does not make the menu item non-selectable.
Alternatively, each item can be a string rather than a cons
cell; this makes a non-selectable menu item.
If the user gets rid of the menu without making a valid choice, for
instance by clicking the mouse away from a valid choice or by typing
C-g, then this normally results in a quit and
x-popup-menu does not return. But if position is a mouse
button event (indicating that the user invoked the menu with the
mouse) then no quit occurs and x-popup-menu returns nil.
Usage note: Don’t use x-popup-menu to display a menu
if you could do the job with a prefix key defined with a menu keymap.
If you use a menu keymap to implement a menu, C-h c and C-h
a can see the individual items in that menu and provide help for them.
If instead you implement the menu by defining a command that calls
x-popup-menu, the help facilities cannot know what happens inside
that command, so they cannot give any help for the menu’s items.
The menu bar mechanism, which lets you switch between submenus by
moving the mouse, cannot look within the definition of a command to see
that it calls x-popup-menu. Therefore, if you try to implement a
submenu using x-popup-menu, it cannot work with the menu bar in
an integrated fashion. This is why all menu bar submenus are
implemented with menu keymaps within the parent menu, and never with
x-popup-menu. See section The Menu Bar.
If you want a menu bar submenu to have contents that vary, you should
still use a menu keymap to implement it. To make the contents vary, add
a hook function to menu-bar-update-hook to update the contents of
the menu keymap as necessary.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A dialog box is a variant of a pop-up menu—it looks a little
different, it always appears in the center of a frame, and it has just
one level and one or more buttons. The main use of dialog boxes is
for asking questions that the user can answer with “yes”, “no”,
and a few other alternatives. With a single button, they can also
force the user to acknowledge important information. The functions
y-or-n-p and yes-or-no-p use dialog boxes instead of the
keyboard, when called from commands invoked by mouse clicks.
This function displays a pop-up dialog box and returns an indication of what selection the user makes. The argument contents specifies the alternatives to offer; it has this format:
(title (string . value)…)
which looks like the list that specifies a single pane for
x-popup-menu.
The return value is value from the chosen alternative.
As for x-popup-menu, an element of the list may be just a
string instead of a cons cell (string . value).
That makes a box that cannot be selected.
If nil appears in the list, it separates the left-hand items from
the right-hand items; items that precede the nil appear on the
left, and items that follow the nil appear on the right. If you
don’t include a nil in the list, then approximately half the
items appear on each side.
Dialog boxes always appear in the center of a frame; the argument
position specifies which frame. The possible values are as in
x-popup-menu, but the precise coordinates or the individual
window don’t matter; only the frame matters.
If header is non-nil, the frame title for the box is
‘Information’, otherwise it is ‘Question’. The former is used
for message-box (see message-box). (On text terminals, the
box title is not displayed.)
In some configurations, Emacs cannot display a real dialog box; so instead it displays the same items in a pop-up menu in the center of the frame.
If the user gets rid of the dialog box without making a valid choice,
for instance using the window manager, then this produces a quit and
x-popup-dialog does not return.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can specify the mouse pointer style for particular text or
images using the pointer text property, and for images with the
:pointer and :map image properties. The values you can
use in these properties are text (or nil), arrow,
hand, vdrag, hdrag, modeline, and
hourglass. text stands for the usual mouse pointer
style used over text.
Over void parts of the window (parts that do not correspond to any
of the buffer contents), the mouse pointer usually uses the
arrow style, but you can specify a different style (one of
those above) by setting void-text-area-pointer.
This variable specifies the mouse pointer style for void text areas.
These include the areas after the end of a line or below the last line
in the buffer. The default is to use the arrow (non-text)
pointer style.
When using X, you can specify what the text pointer style
really looks like by setting the variable x-pointer-shape.
This variable specifies the pointer shape to use ordinarily in the
Emacs frame, for the text pointer style.
This variable specifies the pointer shape to use when the mouse is over mouse-sensitive text.
These variables affect newly created frames. They do not normally affect existing frames; however, if you set the mouse color of a frame, that also installs the current value of those two variables. See section Font and Color Parameters.
The values you can use, to specify either of these pointer shapes, are defined in the file lisp/term/x-win.el. Use M-x apropos RET x-pointer RET to see a list of them.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In the X window system, data can be transferred between different applications by means of selections. X defines an arbitrary number of selection types, each of which can store its own data; however, only three are commonly used: the clipboard, primary selection, and secondary selection. See Cut and Paste in The GNU Emacs Manual, for Emacs commands that make use of these selections. This section documents the low-level functions for reading and setting X selections.
This function sets an X selection. It takes two arguments: a selection type type, and the value to assign to it, data.
type should be a symbol; it is usually one of PRIMARY,
SECONDARY or CLIPBOARD. These are symbols with
upper-case names, in accord with X Window System conventions. If
type is nil, that stands for PRIMARY.
If data is nil, it means to clear out the selection.
Otherwise, data may be a string, a symbol, an integer (or a cons
of two integers or list of two integers), an overlay, or a cons of two
markers pointing to the same buffer. An overlay or a pair of markers
stands for text in the overlay or between the markers. The argument
data may also be a vector of valid non-vector selection values.
This function returns data.
This function accesses selections set up by Emacs or by other X
clients. It takes two optional arguments, type and
data-type. The default for type, the selection type, is
PRIMARY.
The data-type argument specifies the form of data conversion to
use, to convert the raw data obtained from another X client into Lisp
data. Meaningful values include TEXT, STRING,
UTF8_STRING, TARGETS, LENGTH, DELETE,
FILE_NAME, CHARACTER_POSITION, NAME,
LINE_NUMBER, COLUMN_NUMBER, OWNER_OS,
HOST_NAME, USER, CLASS, ATOM, and
INTEGER. (These are symbols with upper-case names in accord
with X conventions.) The default for data-type is
STRING.
This variable specifies the coding system to use when reading and
writing selections or the clipboard. See section Coding Systems. The default is compound-text-with-extensions, which
converts to the text representation that X11 normally uses.
When Emacs runs on MS-Windows, it does not implement X selections in
general, but it does support the clipboard. x-get-selection
and x-set-selection on MS-Windows support the text data type
only; if the clipboard holds other types of data, Emacs treats the
clipboard as empty.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When a user drags something from another application over Emacs, that other
application expects Emacs to tell it if Emacs can handle the data that is
dragged. The variable x-dnd-test-function is used by Emacs to determine
what to reply. The default value is x-dnd-default-test-function
which accepts drops if the type of the data to be dropped is present in
x-dnd-known-types. You can customize x-dnd-test-function and/or
x-dnd-known-types if you want Emacs to accept or reject drops based
on some other criteria.
If you want to change the way Emacs handles drop of different types
or add a new type, customize x-dnd-types-alist. This requires
detailed knowledge of what types other applications use for drag and
drop.
When an URL is dropped on Emacs it may be a file, but it may also be
another URL type (ftp, http, etc.). Emacs first checks
dnd-protocol-alist to determine what to do with the URL. If
there is no match there and if browse-url-browser-function is
an alist, Emacs looks for a match there. If no match is found the
text for the URL is inserted. If you want to alter Emacs behavior,
you can customize these variables.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A color name is text (usually in a string) that specifies a color. Symbolic names such as ‘black’, ‘white’, ‘red’, etc., are allowed; use M-x list-colors-display to see a list of defined names. You can also specify colors numerically in forms such as ‘#rgb’ and ‘RGB:r/g/b’, where r specifies the red level, g specifies the green level, and b specifies the blue level. You can use either one, two, three, or four hex digits for r; then you must use the same number of hex digits for all g and b as well, making either 3, 6, 9 or 12 hex digits in all. (See the documentation of the X Window System for more details about numerical RGB specification of colors.)
These functions provide a way to determine which color names are valid, and what they look like. In some cases, the value depends on the selected frame, as described below; see Input Focus, for the meaning of the term “selected frame”.
To read user input of color names with completion, use
read-color (see section read-color).
This function reports whether a color name is meaningful. It returns
t if so; otherwise, nil. The argument frame says
which frame’s display to ask about; if frame is omitted or
nil, the selected frame is used.
Note that this does not tell you whether the display you are using
really supports that color. When using X, you can ask for any defined
color on any kind of display, and you will get some result—typically,
the closest it can do. To determine whether a frame can really display
a certain color, use color-supported-p (see below).
This function used to be called x-color-defined-p,
and that name is still supported as an alias.
This function returns a list of the color names that are defined
and supported on frame frame (default, the selected frame).
If frame does not support colors, the value is nil.
This function used to be called x-defined-colors,
and that name is still supported as an alias.
This returns t if frame can really display the color
color (or at least something close to it). If frame is
omitted or nil, the question applies to the selected frame.
Some terminals support a different set of colors for foreground and
background. If background-p is non-nil, that means you are
asking whether color can be used as a background; otherwise you
are asking whether it can be used as a foreground.
The argument color must be a valid color name.
This returns t if color is a shade of gray, as defined on
frame’s display. If frame is omitted or nil, the
question applies to the selected frame. If color is not a valid
color name, this function returns nil.
This function returns a value that describes what color should ideally look like on frame. If color is defined, the value is a list of three integers, which give the amount of red, the amount of green, and the amount of blue. Each integer ranges in principle from 0 to 65535, but some displays may not use the full range. This three-element list is called the rgb values of the color.
If color is not defined, the value is nil.
(color-values "black")
⇒ (0 0 0)
(color-values "white")
⇒ (65280 65280 65280)
(color-values "red")
⇒ (65280 0 0)
(color-values "pink")
⇒ (65280 49152 51968)
(color-values "hungry")
⇒ nil
The color values are returned for frame’s display. If
frame is omitted or nil, the information is returned for
the selected frame’s display. If the frame cannot display colors, the
value is nil.
This function used to be called x-color-values,
and that name is still supported as an alias.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Text terminals usually support only a small number of colors, and the computer uses small integers to select colors on the terminal. This means that the computer cannot reliably tell what the selected color looks like; instead, you have to inform your application which small integers correspond to which colors. However, Emacs does know the standard set of colors and will try to use them automatically.
The functions described in this section control how terminal colors are used by Emacs.
Several of these functions use or return rgb values, described in Color Names.
These functions accept a display (either a frame or the name of a terminal) as an optional argument. We hope in the future to make Emacs support different colors on different text terminals; then this argument will specify which terminal to operate on (the default being the selected frame’s terminal; see section Input Focus). At present, though, the frame argument has no effect.
This function associates the color name name with color number number on the terminal.
The optional argument rgb, if specified, is an rgb value, a list
of three numbers that specify what the color actually looks like.
If you do not specify rgb, then this color cannot be used by
tty-color-approximate to approximate other colors, because
Emacs will not know what it looks like.
This function clears the table of defined colors for a text terminal.
This function returns an alist recording the known colors supported by a text terminal.
Each element has the form (name number . rgb)
or (name number). Here, name is the color
name, number is the number used to specify it to the terminal.
If present, rgb is a list of three color values (for red, green,
and blue) that says what the color actually looks like.
This function finds the closest color, among the known colors
supported for display, to that described by the rgb value
rgb (a list of color values). The return value is an element of
tty-color-alist.
This function finds the closest color to color among the known
colors supported for display and returns its index (an integer).
If the name color is not defined, the value is nil.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes some of the functions and variables for querying and using X resources, or their equivalent on your operating system. See X Resources in The GNU Emacs Manual, for more information about X resources.
The function x-get-resource retrieves a resource value from the X
Window defaults database.
Resources are indexed by a combination of a key and a class. This function searches using a key of the form ‘instance.attribute’ (where instance is the name under which Emacs was invoked), and using ‘Emacs.class’ as the class.
The optional arguments component and subclass add to the key and the class, respectively. You must specify both of them or neither. If you specify them, the key is ‘instance.component.attribute’, and the class is ‘Emacs.class.subclass’.
This variable specifies the application name that x-get-resource
should look up. The default value is "Emacs". You can examine X
resources for application names other than “Emacs” by binding this
variable to some other string, around a call to x-get-resource.
This variable specifies the instance name that x-get-resource
should look up. The default value is the name Emacs was invoked with,
or the value specified with the ‘-name’ or ‘-rn’ switches.
To illustrate some of the above, suppose that you have the line:
xterm.vt100.background: yellow
in your X resources file (whose name is usually ~/.Xdefaults or ~/.Xresources). Then:
(let ((x-resource-class "XTerm") (x-resource-name "xterm"))
(x-get-resource "vt100.background" "VT100.Background"))
⇒ "yellow"
(let ((x-resource-class "XTerm") (x-resource-name "xterm"))
(x-get-resource "background" "VT100" "vt100" "Background"))
⇒ "yellow"
If this variable is non-nil, Emacs does not look up X
resources, and X resources do not have any effect when creating new
frames.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The functions in this section describe the basic capabilities of a particular display. Lisp programs can use them to adapt their behavior to what the display can do. For example, a program that ordinarily uses a popup menu could use the minibuffer if popup menus are not supported.
The optional argument display in these functions specifies which
display to ask the question about. It can be a display name, a frame
(which designates the display that frame is on), or nil (which
refers to the selected frame’s display, see section Input Focus).
See section Color Names, Text Terminal Colors, for other functions to obtain information about displays.
This function returns t if popup menus are supported on
display, nil if not. Support for popup menus requires
that the mouse be available, since the menu is popped up by clicking
the mouse on some portion of the Emacs display.
This function returns t if display is a graphic display
capable of displaying several frames and several different fonts at
once. This is true for displays that use a window system such as X,
and false for text terminals.
This function returns t if display has a mouse available,
nil if not.
This function returns t if the screen is a color screen.
It used to be called x-display-color-p, and that name
is still supported as an alias.
This function returns t if the screen can display shades of gray.
(All color displays can do this.)
This function returns non-nil if all the face attributes in
attributes are supported (see section Face Attributes).
The definition of ‘supported’ is somewhat heuristic, but basically means that a face containing all the attributes in attributes, when merged with the default face for display, can be represented in a way that’s
Point (2) implies that a :weight black attribute will be
satisfied by any display that can display bold, as will
:foreground "yellow" as long as some yellowish color can be
displayed, but :slant italic will not be satisfied by
the tty display code’s automatic substitution of a ‘dim’ face for
italic.
This function returns t if display supports selections.
Windowed displays normally support selections, but they may also be
supported in some other cases.
This function returns t if display can display images.
Windowed displays ought in principle to handle images, but some
systems lack the support for that. On a display that does not support
images, Emacs cannot display a tool bar.
This function returns the number of screens associated with the display.
This function returns the height of the screen in pixels. On a character terminal, it gives the height in characters.
For graphical terminals, note that on “multi-monitor” setups this refers to the pixel height for all physical monitors associated with display. See section Multiple Terminals.
This function returns the width of the screen in pixels. On a character terminal, it gives the width in characters.
For graphical terminals, note that on “multi-monitor” setups this refers to the pixel width for all physical monitors associated with display. See section Multiple Terminals.
This function returns the height of the screen in millimeters,
or nil if Emacs cannot get that information.
For graphical terminals, note that on “multi-monitor” setups this refers to the height for all physical monitors associated with display. See section Multiple Terminals.
This function returns the width of the screen in millimeters,
or nil if Emacs cannot get that information.
For graphical terminals, note that on “multi-monitor” setups this refers to the width for all physical monitors associated with display. See section Multiple Terminals.
This variable allows the user to specify the dimensions of graphical
displays returned by display-mm-height and
display-mm-width in case the system provides incorrect values.
This function returns the backing store capability of the display. Backing store means recording the pixels of windows (and parts of windows) that are not exposed, so that when exposed they can be displayed very quickly.
Values can be the symbols always, when-mapped, or
not-useful. The function can also return nil
when the question is inapplicable to a certain kind of display.
This function returns non-nil if the display supports the
SaveUnder feature. That feature is used by pop-up windows
to save the pixels they obscure, so that they can pop down
quickly.
This function returns the number of planes the display supports. This is typically the number of bits per pixel. For a tty display, it is log to base two of the number of colors supported.
This function returns the visual class for the screen. The value is
one of the symbols static-gray (a limited, unchangeable number
of grays), gray-scale (a full range of grays),
static-color (a limited, unchangeable number of colors),
pseudo-color (a limited number of colors), true-color (a
full range of colors), and direct-color (a full range of
colors).
This function returns the number of color cells the screen supports.
These functions obtain additional information about the window
system in use where Emacs shows the specified display. (Their
names begin with x- for historical reasons.)
This function returns the list of version numbers of the GUI window system running on display, such as the X server on GNU and Unix systems. The value is a list of three integers: the major and minor version numbers of the protocol, and the distributor-specific release number of the window system software itself. On GNU and Unix systems, these are normally the version of the X protocol and the distributor-specific release number of the X server software. On MS-Windows, this is the version of the Windows OS.
This function returns the “vendor” that provided the window system software (as a string). On GNU and Unix systems this really means whoever distributes the X server. On MS-Windows this is the vendor ID string of the Windows OS (Microsoft).
When the developers of X labeled software distributors as “vendors”, they showed their false assumption that no system could ever be developed and distributed noncommercially.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A position is the index of a character in the text of a buffer. More precisely, a position identifies the place between two characters (or before the first character, or after the last character), so we can speak of the character before or after a given position. However, we often speak of the character “at” a position, meaning the character after that position.
Positions are usually represented as integers starting from 1, but can also be represented as markers—special objects that relocate automatically when text is inserted or deleted so they stay with the surrounding characters. Functions that expect an argument to be a position (an integer), but accept a marker as a substitute, normally ignore which buffer the marker points into; they convert the marker to an integer, and use that integer, exactly as if you had passed the integer as the argument, even if the marker points to the “wrong” buffer. A marker that points nowhere cannot convert to an integer; using it instead of an integer causes an error. See section Markers.
See also the “field” feature (see section Defining and Using Fields), which provides functions that are used by many cursor-motion commands.
| 29.1 Point | The special position where editing takes place. | |
| 29.2 Motion | Changing point. | |
| 29.3 Excursions | Temporary motion and buffer changes. | |
| 29.4 Narrowing | Restricting editing to a portion of the buffer. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Point is a special buffer position used by many editing commands, including the self-inserting typed characters and text insertion functions. Other commands move point through the text to allow editing and insertion at different places.
Like other positions, point designates a place between two characters (or before the first character, or after the last character), rather than a particular character. Usually terminals display the cursor over the character that immediately follows point; point is actually before the character on which the cursor sits.
The value of point is a number no less than 1, and no greater than the buffer size plus 1. If narrowing is in effect (see section Narrowing), then point is constrained to fall within the accessible portion of the buffer (possibly at one end of it).
Each buffer has its own value of point, which is independent of the value of point in other buffers. Each window also has a value of point, which is independent of the value of point in other windows on the same buffer. This is why point can have different values in various windows that display the same buffer. When a buffer appears in only one window, the buffer’s point and the window’s point normally have the same value, so the distinction is rarely important. See section Windows and Point, for more details.
This function returns the value of point in the current buffer, as an integer.
(point)
⇒ 175
This function returns the minimum accessible value of point in the current buffer. This is normally 1, but if narrowing is in effect, it is the position of the start of the region that you narrowed to. (See section Narrowing.)
This function returns the maximum accessible value of point in the
current buffer. This is (1+ (buffer-size)), unless narrowing is
in effect, in which case it is the position of the end of the region
that you narrowed to. (See section Narrowing.)
This function returns (point-max) if flag is greater than
0, (point-min) otherwise. The argument flag must be a
number.
This function returns the total number of characters in the current
buffer. In the absence of any narrowing (see section Narrowing),
point-max returns a value one larger than this.
If you specify a buffer, buffer, then the value is the size of buffer.
(buffer-size)
⇒ 35
(point-max)
⇒ 36
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Motion functions change the value of point, either relative to the current value of point, relative to the beginning or end of the buffer, or relative to the edges of the selected window. See section Point.
| 29.2.1 Motion by Characters | Moving in terms of characters. | |
| 29.2.2 Motion by Words | Moving in terms of words. | |
| 29.2.3 Motion to an End of the Buffer | Moving to the beginning or end of the buffer. | |
| 29.2.4 Motion by Text Lines | Moving in terms of lines of text. | |
| 29.2.5 Motion by Screen Lines | Moving in terms of lines as displayed. | |
| 29.2.6 Moving over Balanced Expressions | Moving by parsing lists and sexps. | |
| 29.2.7 Skipping Characters | Skipping characters belonging to a certain set. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These functions move point based on a count of characters.
goto-char is the fundamental primitive; the other functions use
that.
This function sets point in the current buffer to the value position.
If narrowing is in effect, position still counts from the
beginning of the buffer, but point cannot go outside the accessible
portion. If position is out of range, goto-char moves
point to the beginning or the end of the accessible portion.
When this function is called interactively, position is the numeric prefix argument, if provided; otherwise it is read from the minibuffer.
goto-char returns position.
This function moves point count characters forward, towards the
end of the buffer (or backward, towards the beginning of the buffer, if
count is negative). If count is nil, the default
is 1.
If this attempts to move past the beginning or end of the buffer (or
the limits of the accessible portion, when narrowing is in effect), it
signals an error with error symbol beginning-of-buffer or
end-of-buffer.
In an interactive call, count is the numeric prefix argument.
This is just like forward-char except that it moves
in the opposite direction.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These functions for parsing words use the syntax table to decide whether a given character is part of a word. See section Syntax Tables.
This function moves point forward count words (or backward if
count is negative). If count is omitted or nil, it
defaults to 1.
“Moving one word” means moving until point crosses a word-constituent character and then encounters a word-separator character. However, this function cannot move point past the boundary of the accessible portion of the buffer, or across a field boundary (see section Defining and Using Fields). The most common case of a field boundary is the end of the prompt in the minibuffer.
If it is possible to move count words, without being stopped
prematurely by the buffer boundary or a field boundary, the value is
t. Otherwise, the return value is nil and point stops at
the buffer boundary or field boundary.
If inhibit-field-text-motion is non-nil,
this function ignores field boundaries.
In an interactive call, count is specified by the numeric prefix argument.
This function is just like forward-word, except that it moves
backward until encountering the front of a word, rather than forward.
This variable affects the behavior of forward-word and everything
that uses it. If it is non-nil, then characters in the
“escape” and “character quote” syntax classes count as part of
words. Otherwise, they do not.
If this variable is non-nil, certain motion functions including
forward-word, forward-sentence, and
forward-paragraph ignore field boundaries.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To move point to the beginning of the buffer, write:
(goto-char (point-min))
Likewise, to move to the end of the buffer, use:
(goto-char (point-max))
Here are two commands that users use to do these things. They are documented here to warn you not to use them in Lisp programs, because they set the mark and display messages in the echo area.
This function moves point to the beginning of the buffer (or the limits of the accessible portion, when narrowing is in effect), setting the mark at the previous position (except in Transient Mark mode, if the mark is already active, it does not set the mark.)
If n is non-nil, then it puts point n tenths of the
way from the beginning of the accessible portion of the buffer. In an
interactive call, n is the numeric prefix argument, if provided;
otherwise n defaults to nil.
Warning: Don’t use this function in Lisp programs!
This function moves point to the end of the buffer (or the limits of
the accessible portion, when narrowing is in effect), setting the mark
at the previous position (except in Transient Mark mode when the mark
is already active). If n is non-nil, then it puts point
n tenths of the way from the end of the accessible portion of
the buffer.
In an interactive call, n is the numeric prefix argument,
if provided; otherwise n defaults to nil.
Warning: Don’t use this function in Lisp programs!
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Text lines are portions of the buffer delimited by newline characters, which are regarded as part of the previous line. The first text line begins at the beginning of the buffer, and the last text line ends at the end of the buffer whether or not the last character is a newline. The division of the buffer into text lines is not affected by the width of the window, by line continuation in display, or by how tabs and control characters are displayed.
This function moves point to the beginning of the current line. With an
argument count not nil or 1, it moves forward
count-1 lines and then to the beginning of the line.
This function does not move point across a field boundary
(see section Defining and Using Fields) unless doing so would move beyond there to a
different line; therefore, if count is nil or 1, and
point starts at a field boundary, point does not move. To ignore
field boundaries, either bind inhibit-field-text-motion to
t, or use the forward-line function instead. For
instance, (forward-line 0) does the same thing as
(beginning-of-line), except that it ignores field boundaries.
If this function reaches the end of the buffer (or of the accessible portion, if narrowing is in effect), it positions point there. No error is signaled.
Return the position that (beginning-of-line count)
would move to.
This function moves point to the end of the current line. With an
argument count not nil or 1, it moves forward
count-1 lines and then to the end of the line.
This function does not move point across a field boundary
(see section Defining and Using Fields) unless doing so would move beyond there to a
different line; therefore, if count is nil or 1, and
point starts at a field boundary, point does not move. To ignore
field boundaries, bind inhibit-field-text-motion to t.
If this function reaches the end of the buffer (or of the accessible portion, if narrowing is in effect), it positions point there. No error is signaled.
Return the position that (end-of-line count)
would move to.
This function moves point forward count lines, to the beginning of
the line. If count is negative, it moves point
-count lines backward, to the beginning of a line. If
count is zero, it moves point to the beginning of the current
line. If count is nil, that means 1.
If forward-line encounters the beginning or end of the buffer (or
of the accessible portion) before finding that many lines, it sets point
there. No error is signaled.
forward-line returns the difference between count and the
number of lines actually moved. If you attempt to move down five lines
from the beginning of a buffer that has only three lines, point stops at
the end of the last line, and the value will be 2.
In an interactive call, count is the numeric prefix argument.
This function returns the number of lines between the positions start and end in the current buffer. If start and end are equal, then it returns 0. Otherwise it returns at least 1, even if start and end are on the same line. This is because the text between them, considered in isolation, must contain at least one line unless it is empty.
This function returns the number of words between the positions start and end in the current buffer.
This function can also be called interactively. In that case, it prints a message reporting the number of lines, words, and characters in the buffer, or in the region if the region is active.
This function returns the line number in the current buffer
corresponding to the buffer position pos. If pos is nil
or omitted, the current buffer position is used.
Also see the functions bolp and eolp in Examining Text Near Point.
These functions do not move point, but test whether it is already at the
beginning or end of a line.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The line functions in the previous section count text lines, delimited only by newline characters. By contrast, these functions count screen lines, which are defined by the way the text appears on the screen. A text line is a single screen line if it is short enough to fit the width of the selected window, but otherwise it may occupy several screen lines.
In some cases, text lines are truncated on the screen rather than
continued onto additional screen lines. In these cases,
vertical-motion moves point much like forward-line.
See section Truncation.
Because the width of a given string depends on the flags that control
the appearance of certain characters, vertical-motion behaves
differently, for a given piece of text, depending on the buffer it is
in, and even on the selected window (because the width, the truncation
flag, and display table may vary between windows). See section Usual Display Conventions.
These functions scan text to determine where screen lines break, and thus take time proportional to the distance scanned.
This function moves point to the start of the screen line count screen lines down from the screen line containing point. If count is negative, it moves up instead.
The count argument can be a cons cell, (cols
. lines), instead of an integer. Then the function moves by
lines screen lines, and puts point cols columns from the
visual start of that screen line. Note that cols are counted
from the visual start of the line; if the window is scrolled
horizontally (see section Horizontal Scrolling), the column on which point
will end is in addition to the number of columns by which the text is
scrolled.
The return value is the number of screen lines over which point was moved. The value may be less in absolute value than count if the beginning or end of the buffer was reached.
The window window is used for obtaining parameters such as the
width, the horizontal scrolling, and the display table. But
vertical-motion always operates on the current buffer, even if
window currently displays some other buffer.
This function returns the number of screen lines in the text from
beg to end. The number of screen lines may be different
from the number of actual lines, due to line continuation, the display
table, etc. If beg and end are nil or omitted,
they default to the beginning and end of the accessible portion of the
buffer.
If the region ends with a newline, that is ignored unless the optional
third argument count-final-newline is non-nil.
The optional fourth argument window specifies the window for obtaining parameters such as width, horizontal scrolling, and so on. The default is to use the selected window’s parameters.
Like vertical-motion, count-screen-lines always uses the
current buffer, regardless of which buffer is displayed in
window. This makes possible to use count-screen-lines in
any buffer, whether or not it is currently displayed in some window.
This function moves point with respect to the text currently displayed in the selected window. It moves point to the beginning of the screen line count screen lines from the top of the window. If count is negative, that specifies a position -count lines from the bottom (or the last line of the buffer, if the buffer ends above the specified screen position).
If count is nil, then point moves to the beginning of the
line in the middle of the window. If the absolute value of count
is greater than the size of the window, then point moves to the place
that would appear on that screen line if the window were tall enough.
This will probably cause the next redisplay to scroll to bring that
location onto the screen.
In an interactive call, count is the numeric prefix argument.
The value returned is the window line number point has moved to, with the top line in the window numbered 0.
This function scans the current buffer, calculating screen positions. It scans the buffer forward from position from, assuming that is at screen coordinates frompos, to position to or coordinates topos, whichever comes first. It returns the ending buffer position and screen coordinates.
The coordinate arguments frompos and topos are cons cells of
the form (hpos . vpos).
The argument width is the number of columns available to display
text; this affects handling of continuation lines. nil means
the actual number of usable text columns in the window, which is
equivalent to the value returned by (window-width window).
The argument offsets is either nil or a cons cell of the
form (hscroll . tab-offset). Here hscroll is
the number of columns not being displayed at the left margin; most
callers get this by calling window-hscroll. Meanwhile,
tab-offset is the offset between column numbers on the screen and
column numbers in the buffer. This can be nonzero in a continuation
line, when the previous screen lines’ widths do not add up to a multiple
of tab-width. It is always zero in a non-continuation line.
The window window serves only to specify which display table to
use. compute-motion always operates on the current buffer,
regardless of what buffer is displayed in window.
The return value is a list of five elements:
(pos hpos vpos prevhpos contin)
Here pos is the buffer position where the scan stopped, vpos is the vertical screen position, and hpos is the horizontal screen position.
The result prevhpos is the horizontal position one character back
from pos. The result contin is t if the last line
was continued after (or within) the previous character.
For example, to find the buffer position of column col of screen line
line of a certain window, pass the window’s display start location
as from and the window’s upper-left coordinates as frompos.
Pass the buffer’s (point-max) as to, to limit the scan to
the end of the accessible portion of the buffer, and pass line and
col as topos. Here’s a function that does this:
(defun coordinates-of-position (col line)
(car (compute-motion (window-start)
'(0 . 0)
(point-max)
(cons col line)
(window-width)
(cons (window-hscroll) 0)
(selected-window))))
When you use compute-motion for the minibuffer, you need to use
minibuffer-prompt-width to get the horizontal position of the
beginning of the first screen line. See section Minibuffer Contents.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here are several functions concerned with balanced-parenthesis expressions (also called sexps in connection with moving across them in Emacs). The syntax table controls how these functions interpret various characters; see Syntax Tables. See section Parsing Expressions, for lower-level primitives for scanning sexps or parts of sexps. For user-level commands, see Commands for Editing with Parentheses in The GNU Emacs Manual.
This function moves forward across arg (default 1) balanced groups of parentheses. (Other syntactic entities such as words or paired string quotes are ignored.)
This function moves backward across arg (default 1) balanced groups of parentheses. (Other syntactic entities such as words or paired string quotes are ignored.)
This function moves forward out of arg (default 1) levels of parentheses. A negative argument means move backward but still to a less deep spot.
This function moves forward into arg (default 1) levels of parentheses. A negative argument means move backward but still go deeper in parentheses (-arg levels).
This function moves forward across arg (default 1) balanced expressions. Balanced expressions include both those delimited by parentheses and other kinds, such as words and string constants. See section Parsing Expressions. For example,
---------- Buffer: foo ---------- (concat∗ "foo " (car x) y z) ---------- Buffer: foo ----------
(forward-sexp 3)
⇒ nil
---------- Buffer: foo ----------
(concat "foo " (car x) y∗ z)
---------- Buffer: foo ----------
This function moves backward across arg (default 1) balanced expressions.
This function moves back to the argth beginning of a defun. If arg is negative, this actually moves forward, but it still moves to the beginning of a defun, not to the end of one. arg defaults to 1.
This function moves forward to the argth end of a defun. If arg is negative, this actually moves backward, but it still moves to the end of a defun, not to the beginning of one. arg defaults to 1.
If non-nil, this buffer-local variable holds a regular
expression that specifies what text can appear before the
open-parenthesis that starts a defun. That is to say, a defun begins
on a line that starts with a match for this regular expression,
followed by a character with open-parenthesis syntax.
If this variable’s value is non-nil, an open parenthesis in
column 0 is considered to be the start of a defun. If it is
nil, an open parenthesis in column 0 has no special meaning.
The default is t.
If non-nil, this variable holds a function for finding the
beginning of a defun. The function beginning-of-defun
calls this function instead of using its normal method, passing it its
optional argument. If the argument is non-nil, the function
should move back by that many functions, like
beginning-of-defun does.
If non-nil, this variable holds a function for finding the end of
a defun. The function end-of-defun calls this function instead
of using its normal method.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The following two functions move point over a specified set of characters. For example, they are often used to skip whitespace. For related functions, see Motion and Syntax.
These functions convert the set string to multibyte if the buffer is multibyte, and they convert it to unibyte if the buffer is unibyte, as the search functions do (see section Searching and Matching).
This function moves point in the current buffer forward, skipping over a given set of characters. It examines the character following point, then advances point if the character matches character-set. This continues until it reaches a character that does not match. The function returns the number of characters moved over.
The argument character-set is a string, like the inside of a
‘[…]’ in a regular expression except that ‘]’ does not
terminate it, and ‘\’ quotes ‘^’, ‘-’ or ‘\’.
Thus, "a-zA-Z" skips over all letters, stopping before the
first nonletter, and "^a-zA-Z" skips nonletters stopping before
the first letter. See See section Regular Expressions. Character classes
can also be used, e.g., "[:alnum:]". See see section Character Classes.
If limit is supplied (it must be a number or a marker), it specifies the maximum position in the buffer that point can be skipped to. Point will stop at or before limit.
In the following example, point is initially located directly before the ‘T’. After the form is evaluated, point is located at the end of that line (between the ‘t’ of ‘hat’ and the newline). The function skips all letters and spaces, but not newlines.
---------- Buffer: foo ---------- I read "∗The cat in the hat comes back" twice. ---------- Buffer: foo ----------
(skip-chars-forward "a-zA-Z ")
⇒ 18
---------- Buffer: foo ----------
I read "The cat in the hat∗
comes back" twice.
---------- Buffer: foo ----------
This function moves point backward, skipping characters that match
character-set, until limit. It is just like
skip-chars-forward except for the direction of motion.
The return value indicates the distance traveled. It is an integer that is zero or less.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
It is often useful to move point “temporarily” within a localized
portion of the program. This is called an excursion, and it is
done with the save-excursion special form. This construct
remembers the initial identity of the current buffer, and its values
of point and the mark, and restores them after the excursion
completes. It is the standard way to move point within one part of a
program and avoid affecting the rest of the program, and is used
thousands of times in the Lisp sources of Emacs.
If you only need to save and restore the identity of the current
buffer, use save-current-buffer or with-current-buffer
instead (see section The Current Buffer). If you need to save or restore
window configurations, see the forms described in Window Configurations and in Frame Configurations.
This special form saves the identity of the current buffer and the
values of point and the mark in it, evaluates body, and finally
restores the buffer and its saved values of point and the mark. All
three saved values are restored even in case of an abnormal exit via
throw or error (see section Nonlocal Exits).
The value returned by save-excursion is the result of the last
form in body, or nil if no body forms were given.
Because save-excursion only saves point and mark for the
buffer that was current at the start of the excursion, any changes
made to point and/or mark in other buffers, during the excursion, will
remain in effect afterward. This frequently leads to unintended
consequences, so the byte compiler warns if you call set-buffer
during an excursion:
Warning: Use `with-current-buffer' rather than
save-excursion+set-buffer
To avoid such problems, you should call save-excursion only
after setting the desired current buffer, as in the following example:
(defun append-string-to-buffer (string buffer)
"Append STRING to the end of BUFFER."
(with-current-buffer buffer
(save-excursion
(goto-char (point-max))
(insert string))))
Likewise, save-excursion does not restore window-buffer
correspondences altered by functions such as switch-to-buffer.
Warning: Ordinary insertion of text adjacent to the saved
point value relocates the saved value, just as it relocates all
markers. More precisely, the saved value is a marker with insertion
type nil. See section Marker Insertion Types. Therefore, when the
saved point value is restored, it normally comes before the inserted
text.
Although save-excursion saves the location of the mark, it does
not prevent functions which modify the buffer from setting
deactivate-mark, and thus causing the deactivation of the mark
after the command finishes. See section The Mark.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Narrowing means limiting the text addressable by Emacs editing commands to a limited range of characters in a buffer. The text that remains addressable is called the accessible portion of the buffer.
Narrowing is specified with two buffer positions, which become the beginning and end of the accessible portion. For most editing commands and primitives, these positions replace the values of the beginning and end of the buffer. While narrowing is in effect, no text outside the accessible portion is displayed, and point cannot move outside the accessible portion. Note that narrowing does not alter actual buffer positions (see section Point); it only determines which positions are considered the accessible portion of the buffer. Most functions refuse to operate on text that is outside the accessible portion.
Commands for saving buffers are unaffected by narrowing; they save the entire buffer regardless of any narrowing.
If you need to display in a single buffer several very different types of text, consider using an alternative facility described in Swapping Text Between Two Buffers.
This function sets the accessible portion of the current buffer to start at start and end at end. Both arguments should be character positions.
In an interactive call, start and end are set to the bounds of the current region (point and the mark, with the smallest first).
This function sets the accessible portion of the current buffer to
include just the current page. An optional first argument
move-count non-nil means to move forward or backward by
move-count pages and then narrow to one page. The variable
page-delimiter specifies where pages start and end
(see section Standard Regular Expressions Used in Editing).
In an interactive call, move-count is set to the numeric prefix argument.
This function cancels any narrowing in the current buffer, so that the entire contents are accessible. This is called widening. It is equivalent to the following expression:
(narrow-to-region 1 (1+ (buffer-size)))
This function returns non-nil if the buffer is narrowed, and
nil otherwise.
This special form saves the current bounds of the accessible portion,
evaluates the body forms, and finally restores the saved bounds,
thus restoring the same state of narrowing (or absence thereof) formerly
in effect. The state of narrowing is restored even in the event of an
abnormal exit via throw or error (see section Nonlocal Exits).
Therefore, this construct is a clean way to narrow a buffer temporarily.
The value returned by save-restriction is that returned by the
last form in body, or nil if no body forms were given.
Caution: it is easy to make a mistake when using the
save-restriction construct. Read the entire description here
before you try it.
If body changes the current buffer, save-restriction still
restores the restrictions on the original buffer (the buffer whose
restrictions it saved from), but it does not restore the identity of the
current buffer.
save-restriction does not restore point and the mark; use
save-excursion for that. If you use both save-restriction
and save-excursion together, save-excursion should come
first (on the outside). Otherwise, the old point value would be
restored with temporary narrowing still in effect. If the old point
value were outside the limits of the temporary narrowing, this would
fail to restore it accurately.
Here is a simple example of correct use of save-restriction:
---------- Buffer: foo ---------- This is the contents of foo This is the contents of foo This is the contents of foo∗ ---------- Buffer: foo ----------
(save-excursion
(save-restriction
(goto-char 1)
(forward-line 2)
(narrow-to-region 1 (point))
(goto-char (point-min))
(replace-string "foo" "bar")))
---------- Buffer: foo ----------
This is the contents of bar
This is the contents of bar
This is the contents of foo∗
---------- Buffer: foo ----------
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A marker is a Lisp object used to specify a position in a buffer relative to the surrounding text. A marker changes its offset from the beginning of the buffer automatically whenever text is inserted or deleted, so that it stays with the two characters on either side of it.
| 30.1 Overview of Markers | The components of a marker, and how it relocates. | |
| 30.2 Predicates on Markers | Testing whether an object is a marker. | |
| 30.3 Functions that Create Markers | Making empty markers or markers at certain places. | |
| 30.4 Information from Markers | Finding the marker’s buffer or character position. | |
| 30.5 Marker Insertion Types | Two ways a marker can relocate when you insert where it points. | |
| 30.6 Moving Marker Positions | Moving the marker to a new buffer or position. | |
| 30.7 The Mark | How "the mark" is implemented with a marker. | |
| 30.8 The Region | How to access "the region". |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A marker specifies a buffer and a position in that buffer. A marker can be used to represent a position in functions that require one, just as an integer could be used. In that case, the marker’s buffer is normally ignored. Of course, a marker used in this way usually points to a position in the buffer that the function operates on, but that is entirely the programmer’s responsibility. See section Positions, for a complete description of positions.
A marker has three attributes: the marker position, the marker buffer, and the insertion type. The marker position is an integer that is equivalent (at a given time) to the marker as a position in that buffer. But the marker’s position value can change during the life of the marker, and often does. Insertion and deletion of text in the buffer relocate the marker. The idea is that a marker positioned between two characters remains between those two characters despite insertion and deletion elsewhere in the buffer. Relocation changes the integer equivalent of the marker.
Deleting text around a marker’s position leaves the marker between the
characters immediately before and after the deleted text. Inserting
text at the position of a marker normally leaves the marker either in
front of or after the new text, depending on the marker’s insertion
type (see section Marker Insertion Types)—unless the insertion is done
with insert-before-markers (see section Inserting Text).
Insertion and deletion in a buffer must check all the markers and relocate them if necessary. This slows processing in a buffer with a large number of markers. For this reason, it is a good idea to make a marker point nowhere if you are sure you don’t need it any more. Markers that can no longer be accessed are eventually removed (see section Garbage Collection).
Because it is common to perform arithmetic operations on a marker
position, most of these operations (including + and
-) accept markers as arguments. In such cases, the marker
stands for its current position.
Here are examples of creating markers, setting markers, and moving point to markers:
;; Make a new marker that initially does not point anywhere:
(setq m1 (make-marker))
⇒ #<marker in no buffer>
;; Set m1 to point between the 99th and 100th characters
;; in the current buffer:
(set-marker m1 100)
⇒ #<marker at 100 in markers.texi>
;; Now insert one character at the beginning of the buffer:
(goto-char (point-min))
⇒ 1
(insert "Q")
⇒ nil
;; m1 is updated appropriately.
m1
⇒ #<marker at 101 in markers.texi>
;; Two markers that point to the same position ;; are noteq, but they areequal. (setq m2 (copy-marker m1)) ⇒ #<marker at 101 in markers.texi> (eq m1 m2) ⇒ nil (equal m1 m2) ⇒ t
;; When you are finished using a marker, make it point nowhere.
(set-marker m1 nil)
⇒ #<marker in no buffer>
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can test an object to see whether it is a marker, or whether it is either an integer or a marker. The latter test is useful in connection with the arithmetic functions that work with both markers and integers.
This function returns t if object is a marker, nil
otherwise. Note that integers are not markers, even though many
functions will accept either a marker or an integer.
This function returns t if object is an integer or a marker,
nil otherwise.
This function returns t if object is a number (either
integer or floating point) or a marker, nil otherwise.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When you create a new marker, you can make it point nowhere, or point to the present position of point, or to the beginning or end of the accessible portion of the buffer, or to the same place as another given marker.
The next four functions all return markers with insertion type
nil. See section Marker Insertion Types.
This function returns a newly created marker that does not point anywhere.
(make-marker)
⇒ #<marker in no buffer>
This function returns a new marker that points to the present position
of point in the current buffer. See section Point. For an example, see
copy-marker, below.
This function returns a new marker that points to the beginning of the accessible portion of the buffer. This will be the beginning of the buffer unless narrowing is in effect. See section Narrowing.
This function returns a new marker that points to the end of the accessible portion of the buffer. This will be the end of the buffer unless narrowing is in effect. See section Narrowing.
Here are examples of this function and point-min-marker, shown in
a buffer containing a version of the source file for the text of this
chapter.
(point-min-marker)
⇒ #<marker at 1 in markers.texi>
(point-max-marker)
⇒ #<marker at 24080 in markers.texi>
(narrow-to-region 100 200)
⇒ nil
(point-min-marker)
⇒ #<marker at 100 in markers.texi>
(point-max-marker)
⇒ #<marker at 200 in markers.texi>
If passed a marker as its argument, copy-marker returns a
new marker that points to the same place and the same buffer as does
marker-or-integer. If passed an integer as its argument,
copy-marker returns a new marker that points to position
marker-or-integer in the current buffer.
The new marker’s insertion type is specified by the argument insertion-type. See section Marker Insertion Types.
(copy-marker 0)
⇒ #<marker at 1 in markers.texi>
(copy-marker 90000)
⇒ #<marker at 24080 in markers.texi>
An error is signaled if marker is neither a marker nor an integer.
Two distinct markers are considered equal (even though not
eq) to each other if they have the same position and buffer, or
if they both point nowhere.
(setq p (point-marker))
⇒ #<marker at 2139 in markers.texi>
(setq q (copy-marker p))
⇒ #<marker at 2139 in markers.texi>
(eq p q)
⇒ nil
(equal p q)
⇒ t
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes the functions for accessing the components of a marker object.
This function returns the position that marker points to, or
nil if it points nowhere.
This function returns the buffer that marker points into, or
nil if it points nowhere.
(setq m (make-marker))
⇒ #<marker in no buffer>
(marker-position m)
⇒ nil
(marker-buffer m)
⇒ nil
(set-marker m 3770 (current-buffer))
⇒ #<marker at 3770 in markers.texi>
(marker-buffer m)
⇒ #<buffer markers.texi>
(marker-position m)
⇒ 3770
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When you insert text directly at the place where a marker points,
there are two possible ways to relocate that marker: it can point before
the inserted text, or point after it. You can specify which one a given
marker should do by setting its insertion type. Note that use of
insert-before-markers ignores markers’ insertion types, always
relocating a marker to point after the inserted text.
This function sets the insertion type of marker marker to
type. If type is t, marker will advance when
text is inserted at its position. If type is nil,
marker does not advance when text is inserted there.
This function reports the current insertion type of marker.
Most functions that create markers, without an argument allowing to
specify the insertion type, create them with insertion type
nil. Also, the mark has, by default, insertion type
nil.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes how to change the position of an existing marker. When you do this, be sure you know whether the marker is used outside of your program, and, if so, what effects will result from moving it—otherwise, confusing things may happen in other parts of Emacs.
This function moves marker to position in buffer. If buffer is not provided, it defaults to the current buffer.
If position is nil or a marker that points nowhere, then
marker is set to point nowhere.
The value returned is marker.
(setq m (point-marker))
⇒ #<marker at 4714 in markers.texi>
(set-marker m 55)
⇒ #<marker at 55 in markers.texi>
(setq b (get-buffer "foo"))
⇒ #<buffer foo>
(set-marker m 0 b)
⇒ #<marker at 1 in foo>
This is another name for set-marker.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Each buffer has a special marker, which is designated the mark. When a buffer is newly created, this marker exists but does not point anywhere; this means that the mark “doesn’t exist” in that buffer yet. Subsequent commands can set the mark.
The mark specifies a position to bound a range of text for many
commands, such as kill-region and indent-rigidly. These
commands typically act on the text between point and the mark, which
is called the region. If you are writing a command that
operates on the region, don’t examine the mark directly; instead, use
interactive with the ‘r’ specification. This provides the
values of point and the mark as arguments to the command in an
interactive call, but permits other Lisp programs to specify arguments
explicitly. See section Code Characters for interactive.
Some commands set the mark as a side-effect. Commands should do
this only if it has a potential use to the user, and never for their
own internal purposes. For example, the replace-regexp command
sets the mark to the value of point before doing any replacements,
because this enables the user to move back there conveniently after
the replace is finished.
Once the mark “exists” in a buffer, it normally never ceases to
exist. However, it may become inactive, if Transient Mark mode
is enabled. The buffer-local variable mark-active, if
non-nil, means that the mark is active. A command can call the
function deactivate-mark to deactivate the mark directly, or it
can request deactivation of the mark upon return to the editor command
loop by setting the variable deactivate-mark to a
non-nil value.
If Transient Mark mode is enabled, certain editing commands that normally apply to text near point, apply instead to the region when the mark is active. This is the main motivation for using Transient Mark mode. (Another is that this enables highlighting of the region when the mark is active. See section Emacs Display.)
In addition to the mark, each buffer has a mark ring which is a
list of markers containing previous values of the mark. When editing
commands change the mark, they should normally save the old value of the
mark on the mark ring. The variable mark-ring-max specifies the
maximum number of entries in the mark ring; once the list becomes this
long, adding a new element deletes the last element.
There is also a separate global mark ring, but that is used only in a few particular user-level commands, and is not relevant to Lisp programming. So we do not describe it here.
This function returns the current buffer’s mark position as an integer,
or nil if no mark has ever been set in this buffer.
If Transient Mark mode is enabled, and mark-even-if-inactive is
nil, mark signals an error if the mark is inactive.
However, if force is non-nil, then mark disregards
inactivity of the mark, and returns the mark position (or nil)
anyway.
This function returns the marker that represents the current buffer’s mark. It is not a copy, it is the marker used internally. Therefore, changing this marker’s position will directly affect the buffer’s mark. Don’t do that unless that is the effect you want.
(setq m (mark-marker))
⇒ #<marker at 3420 in markers.texi>
(set-marker m 100)
⇒ #<marker at 100 in markers.texi>
(mark-marker)
⇒ #<marker at 100 in markers.texi>
Like any marker, this marker can be set to point at any buffer you like. If you make it point at any buffer other than the one of which it is the mark, it will yield perfectly consistent, but rather odd, results. We recommend that you not do it!
This function sets the mark to position, and activates the mark. The old value of the mark is not pushed onto the mark ring.
Please note: Use this function only if you want the user to
see that the mark has moved, and you want the previous mark position to
be lost. Normally, when a new mark is set, the old one should go on the
mark-ring. For this reason, most applications should use
push-mark and pop-mark, not set-mark.
Novice Emacs Lisp programmers often try to use the mark for the wrong purposes. The mark saves a location for the user’s convenience. An editing command should not alter the mark unless altering the mark is part of the user-level functionality of the command. (And, in that case, this effect should be documented.) To remember a location for internal use in the Lisp program, store it in a Lisp variable. For example:
(let ((beg (point))) (forward-line 1) (delete-region beg (point))).
This function sets the current buffer’s mark to position, and
pushes a copy of the previous mark onto mark-ring. If
position is nil, then the value of point is used.
The function push-mark normally does not activate the
mark. To do that, specify t for the argument activate.
A ‘Mark set’ message is displayed unless nomsg is
non-nil.
This function pops off the top element of mark-ring and makes
that mark become the buffer’s actual mark. This does not move point in
the buffer, and it does nothing if mark-ring is empty. It
deactivates the mark.
This variable, if non-nil, enables Transient Mark mode. In
Transient Mark mode, every buffer-modifying primitive sets
deactivate-mark. As a consequence, most commands that modify
the buffer also deactivate the mark.
When Transient Mark mode is enabled and the mark is active, many
commands that normally apply to the text near point instead apply to
the region. Such commands should use the function use-region-p
to test whether they should operate on the region. See section The Region.
Lisp programs can set transient-mark-mode to non-nil,
non-t values to enable Transient Mark mode temporarily. If the
value is lambda, Transient Mark mode is automatically turned
off after any action, such as buffer modification, that would normally
deactivate the mark. If the value is (only . oldval),
then transient-mark-mode is set to the value oldval after
any subsequent command that moves point and is not shift-translated
(see section shift-translation), or after any other
action that would normally deactivate the mark.
If this is non-nil, Lisp programs and the Emacs user can use the
mark even when it is inactive. This option affects the behavior of
Transient Mark mode. When the option is non-nil, deactivation of
the mark turns off region highlighting, but commands that use the mark
behave as if the mark were still active.
If an editor command sets this variable non-nil, then the editor
command loop deactivates the mark after the command returns (if
Transient Mark mode is enabled). All the primitives that change the
buffer set deactivate-mark, to deactivate the mark when the
command is finished.
To write Lisp code that modifies the buffer without causing
deactivation of the mark at the end of the command, bind
deactivate-mark to nil around the code that does the
modification. For example:
(let (deactivate-mark) (insert " "))
If Transient Mark mode is enabled or force is non-nil,
this function deactivates the mark and runs the normal hook
deactivate-mark-hook. Otherwise, it does nothing.
The mark is active when this variable is non-nil. This
variable is always buffer-local in each buffer. Do not use the
value of this variable to decide whether a command that normally
operates on text near point should operate on the region instead. Use
the function use-region-p for that (see section The Region).
These normal hooks are run, respectively, when the mark becomes active
and when it becomes inactive. The hook activate-mark-hook is
also run at the end of the command loop if the mark is active and it
is possible that the region may have changed.
This function implements the “shift-selection” behavior of
point-motion commands. See Shift Selection in The GNU Emacs
Manual. It is called automatically by the Emacs command loop
whenever a command with a ‘^’ character in its interactive
spec is invoked, before the command itself is executed
(see section ^).
If shift-select-mode is non-nil and the current command
was invoked via shift translation (see section shift-translation), this function sets the mark and temporarily
activates the region, unless the region was already temporarily
activated in this way. Otherwise, if the region has been activated
temporarily, it deactivates the mark and restores the variable
transient-mark-mode to its earlier value.
The value of this buffer-local variable is the list of saved former marks of the current buffer, most recent first.
mark-ring
⇒ (#<marker at 11050 in markers.texi>
#<marker at 10832 in markers.texi>
…)
The value of this variable is the maximum size of mark-ring. If
more marks than this are pushed onto the mark-ring,
push-mark discards an old mark when it adds a new one.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The text between point and the mark is known as the region. Various functions operate on text delimited by point and the mark, but only those functions specifically related to the region itself are described here.
The next two functions signal an error if the mark does not point
anywhere. If Transient Mark mode is enabled and
mark-even-if-inactive is nil, they also signal an error
if the mark is inactive.
This function returns the position of the beginning of the region (as an integer). This is the position of either point or the mark, whichever is smaller.
This function returns the position of the end of the region (as an integer). This is the position of either point or the mark, whichever is larger.
Instead of using region-beginning and region-end, a
command designed to operate on a region should normally use
interactive with the ‘r’ specification to find the
beginning and end of the region. This lets other Lisp programs
specify the bounds explicitly as arguments. See section Code Characters for interactive.
This function returns t if Transient Mark mode is enabled, the
mark is active, and there is a valid region in the buffer. This
function is intended to be used by commands that operate on the
region, instead of on text near point, when the mark is active.
A region is valid if it has a non-zero size, or if the user option
use-empty-active-region is non-nil (by default, it is
nil). The function region-active-p is similar to
use-region-p, but considers all regions as valid. In most
cases, you should not use region-active-p, since if the region
is empty it is often more appropriate to operate on point.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This chapter describes the functions that deal with the text in a buffer. Most examine, insert, or delete text in the current buffer, often operating at point or on text adjacent to point. Many are interactive. All the functions that change the text provide for undoing the changes (see section Undo).
Many text-related functions operate on a region of text defined by two
buffer positions passed in arguments named start and end.
These arguments should be either markers (see section Markers) or numeric
character positions (see section Positions). The order of these arguments
does not matter; it is all right for start to be the end of the
region and end the beginning. For example, (delete-region 1
10) and (delete-region 10 1) are equivalent. An
args-out-of-range error is signaled if either start or
end is outside the accessible portion of the buffer. In an
interactive call, point and the mark are used for these arguments.
Throughout this chapter, “text” refers to the characters in the buffer, together with their properties (when relevant). Keep in mind that point is always between two characters, and the cursor appears on the character after point.
| 31.1 Examining Text Near Point | Examining text in the vicinity of point. | |
| 31.2 Examining Buffer Contents | Examining text in a general fashion. | |
| 31.3 Comparing Text | Comparing substrings of buffers. | |
| 31.4 Inserting Text | Adding new text to a buffer. | |
| 31.5 User-Level Insertion Commands | User-level commands to insert text. | |
| 31.6 Deleting Text | Removing text from a buffer. | |
| 31.7 User-Level Deletion Commands | User-level commands to delete text. | |
| 31.8 The Kill Ring | Where removed text sometimes is saved for later use. | |
| 31.9 Undo | Undoing changes to the text of a buffer. | |
| 31.10 Maintaining Undo Lists | How to enable and disable undo information. How to control how much information is kept. | |
| 31.11 Filling | Functions for explicit filling. | |
| 31.12 Margins for Filling | How to specify margins for filling commands. | |
| 31.13 Adaptive Fill Mode | Adaptive Fill mode chooses a fill prefix from context. | |
| 31.14 Auto Filling | How auto-fill mode is implemented to break lines. | |
| 31.15 Sorting Text | Functions for sorting parts of the buffer. | |
| 31.16 Counting Columns | Computing horizontal positions, and using them. | |
| 31.17 Indentation | Functions to insert or adjust indentation. | |
| 31.18 Case Changes | Case conversion of parts of the buffer. | |
| 31.19 Text Properties | Assigning Lisp property lists to text characters. | |
| 31.20 Substituting for a Character Code | Replacing a given character wherever it appears. | |
| 31.21 Registers | How registers are implemented. Accessing the text or position stored in a register. | |
| 31.22 Transposition of Text | Swapping two portions of a buffer. | |
| 31.23 Dealing With Compressed Data | Dealing with compressed data. | |
| 31.24 Base 64 Encoding | Conversion to or from base 64 encoding. | |
| 31.25 Checksum/Hash | Computing cryptographic hashes. | |
| 31.26 Parsing HTML and XML | ||
| 31.27 Atomic Change Groups | Installing several buffer changes "atomically". | |
| 31.28 Change Hooks | Supplying functions to be run when text is changed. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Many functions are provided to look at the characters around point.
Several simple functions are described here. See also looking-at
in Regular Expression Searching.
In the following four functions, “beginning” or “end” of buffer refers to the beginning or end of the accessible portion.
This function returns the character in the current buffer at (i.e.,
immediately after) position position. If position is out of
range for this purpose, either before the beginning of the buffer, or at
or beyond the end, then the value is nil. The default for
position is point.
In the following example, assume that the first character in the buffer is ‘@’:
(string (char-after 1))
⇒ "@"
This function returns the character in the current buffer immediately
before position position. If position is out of range for
this purpose, either at or before the beginning of the buffer, or beyond
the end, then the value is nil. The default for
position is point.
This function returns the character following point in the current
buffer. This is similar to (char-after (point)). However, if
point is at the end of the buffer, then following-char returns 0.
Remember that point is always between characters, and the cursor
normally appears over the character following point. Therefore, the
character returned by following-char is the character the
cursor is over.
In this example, point is between the ‘a’ and the ‘c’.
---------- Buffer: foo ---------- Gentlemen may cry ``Pea∗ce! Peace!,'' but there is no peace. ---------- Buffer: foo ----------
(string (preceding-char))
⇒ "a"
(string (following-char))
⇒ "c"
This function returns the character preceding point in the current
buffer. See above, under following-char, for an example. If
point is at the beginning of the buffer, preceding-char returns
0.
This function returns t if point is at the beginning of the
buffer. If narrowing is in effect, this means the beginning of the
accessible portion of the text. See also point-min in
Point.
This function returns t if point is at the end of the buffer.
If narrowing is in effect, this means the end of accessible portion of
the text. See also point-max in See section Point.
This function returns t if point is at the beginning of a line.
See section Motion by Text Lines. The beginning of the buffer (or of its accessible
portion) always counts as the beginning of a line.
This function returns t if point is at the end of a line. The
end of the buffer (or of its accessible portion) is always considered
the end of a line.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes functions that allow a Lisp program to convert any portion of the text in the buffer into a string.
This function returns a string containing a copy of the text of the
region defined by positions start and end in the current
buffer. If the arguments are not positions in the accessible portion
of the buffer, buffer-substring signals an
args-out-of-range error.
Here’s an example which assumes Font-Lock mode is not enabled:
---------- Buffer: foo ---------- This is the contents of buffer foo ---------- Buffer: foo ----------
(buffer-substring 1 10)
⇒ "This is t"
(buffer-substring (point-max) 10)
⇒ "he contents of buffer foo\n"
If the text being copied has any text properties, these are copied into the string along with the characters they belong to. See section Text Properties. However, overlays (see section Overlays) in the buffer and their properties are ignored, not copied.
For example, if Font-Lock mode is enabled, you might get results like these:
(buffer-substring 1 10)
⇒ #("This is t" 0 1 (fontified t) 1 9 (fontified t))
This is like buffer-substring, except that it does not copy text
properties, just the characters themselves. See section Text Properties.
This function returns the contents of the entire accessible portion of the current buffer, as a string.
This function filters the buffer text between start and end
using a function specified by the variable
filter-buffer-substring-function, and returns the result.
The default filter function consults the obsolete wrapper hook
filter-buffer-substring-functions, and the obsolete variable
buffer-substring-filters. If both of these are nil, it
returns the unaltered text from the buffer, i.e., what
buffer-substring would return.
If delete is non-nil, the function deletes the text
between start and end after copying it, like
delete-and-extract-region.
Lisp code should use this function instead of buffer-substring,
buffer-substring-no-properties,
or delete-and-extract-region when copying into user-accessible
data structures such as the kill-ring, X clipboard, and registers.
Major and minor modes can modify filter-buffer-substring-function
to alter such text as it is copied out of the buffer.
The value of this variable is a function that filter-buffer-substring
will call to do the actual work. The function receives three
arguments, the same as those of filter-buffer-substring,
which it should treat as per the documentation of that function. It
should return the filtered text (and optionally delete the source text).
The following two variables are obsoleted by
filter-buffer-substring-function, but are still supported for
backward compatibility.
This obsolete variable is a wrapper hook, whose members should be functions
that accept four arguments: fun, start, end, and
delete. fun is a function that takes three arguments
(start, end, and delete), and returns a string. In
both cases, the start, end, and delete arguments are
the same as those of filter-buffer-substring.
The first hook function is passed a fun that is equivalent to
the default operation of filter-buffer-substring, i.e., it
returns the buffer-substring between start and end
(processed by any buffer-substring-filters) and optionally
deletes the original text from the buffer. In most cases, the hook
function will call fun once, and then do its own processing of
the result. The next hook function receives a fun equivalent to
this, and so on. The actual return value is the result of all the
hook functions acting in sequence.
The value of this obsolete variable should be a list of functions
that accept a single string argument and return another string.
The default filter-buffer-substring function passes the buffer
substring to the first function in this list, and the return value of
each function is passed to the next function. The return value of the
last function is passed to filter-buffer-substring-functions.
This function returns the symbol (or word) at or near point, as a string. The return value includes no text properties.
If the optional argument really-word is non-nil, it finds a
word; otherwise, it finds a symbol (which includes both word
characters and symbol constituent characters).
If the optional argument strict is non-nil, then point
must be in or next to the symbol or word—if no symbol or word is
there, the function returns nil. Otherwise, a nearby symbol or
word on the same line is acceptable.
Return the thing around or next to point, as a string.
The argument thing is a symbol which specifies a kind of syntactic
entity. Possibilities include symbol, list, sexp,
defun, filename, url, word, sentence,
whitespace, line, page, and others.
---------- Buffer: foo ----------
Gentlemen may cry ``Pea∗ce! Peace!,''
but there is no peace.
---------- Buffer: foo ----------
(thing-at-point 'word)
⇒ "Peace"
(thing-at-point 'line)
⇒ "Gentlemen may cry ``Peace! Peace!,''\n"
(thing-at-point 'whitespace)
⇒ nil
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This function lets you compare portions of the text in a buffer, without copying them into strings first.
This function lets you compare two substrings of the same buffer or two
different buffers. The first three arguments specify one substring,
giving a buffer (or a buffer name) and two positions within the
buffer. The last three arguments specify the other substring in the
same way. You can use nil for buffer1, buffer2, or
both to stand for the current buffer.
The value is negative if the first substring is less, positive if the first is greater, and zero if they are equal. The absolute value of the result is one plus the index of the first differing characters within the substrings.
This function ignores case when comparing characters
if case-fold-search is non-nil. It always ignores
text properties.
Suppose you have the text ‘foobarbar haha!rara!’ in the current buffer; then in this example the two substrings are ‘rbar ’ and ‘rara!’. The value is 2 because the first substring is greater at the second character.
(compare-buffer-substrings nil 6 11 nil 16 21)
⇒ 2
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Insertion means adding new text to a buffer. The inserted text goes at point—between the character before point and the character after point. Some insertion functions leave point before the inserted text, while other functions leave it after. We call the former insertion after point and the latter insertion before point.
Insertion moves markers located at positions after the insertion
point, so that they stay with the surrounding text (see section Markers).
When a marker points at the place of insertion, insertion may or may
not relocate the marker, depending on the marker’s insertion type
(see section Marker Insertion Types). Certain special functions such as
insert-before-markers relocate all such markers to point after
the inserted text, regardless of the markers’ insertion type.
Insertion functions signal an error if the current buffer is read-only (see section Read-Only Buffers) or if they insert within read-only text (see section Properties with Special Meanings).
These functions copy text characters from strings and buffers along with their properties. The inserted characters have exactly the same properties as the characters they were copied from. By contrast, characters specified as separate arguments, not part of a string or buffer, inherit their text properties from the neighboring text.
The insertion functions convert text from unibyte to multibyte in order to insert in a multibyte buffer, and vice versa—if the text comes from a string or from a buffer. However, they do not convert unibyte character codes 128 through 255 to multibyte characters, not even if the current buffer is a multibyte buffer. See section Converting Text Representations.
This function inserts the strings and/or characters args into the
current buffer, at point, moving point forward. In other words, it
inserts the text before point. An error is signaled unless all
args are either strings or characters. The value is nil.
This function inserts the strings and/or characters args into the
current buffer, at point, moving point forward. An error is signaled
unless all args are either strings or characters. The value is
nil.
This function is unlike the other insertion functions in that it relocates markers initially pointing at the insertion point, to point after the inserted text. If an overlay begins at the insertion point, the inserted text falls outside the overlay; if a nonempty overlay ends at the insertion point, the inserted text falls inside that overlay.
This command inserts count instances of character into the current buffer before point. The argument count must be an integer, and character must be a character.
If called interactively, this command prompts for character using its Unicode name or its code point. See Inserting Text in The GNU Emacs Manual.
This function does not convert unibyte character codes 128 through 255 to multibyte characters, not even if the current buffer is a multibyte buffer. See section Converting Text Representations.
If inherit is non-nil, the inserted characters inherit
sticky text properties from the two characters before and after the
insertion point. See section Stickiness of Text Properties.
This function inserts a portion of buffer from-buffer-or-name
into the current buffer before point. The text inserted is the region
between start (inclusive) and end (exclusive). (These
arguments default to the beginning and end of the accessible portion
of that buffer.) This function returns nil.
In this example, the form is executed with buffer ‘bar’ as the current buffer. We assume that buffer ‘bar’ is initially empty.
---------- Buffer: foo ---------- We hold these truths to be self-evident, that all ---------- Buffer: foo ----------
(insert-buffer-substring "foo" 1 20)
⇒ nil
---------- Buffer: bar ----------
We hold these truth∗
---------- Buffer: bar ----------
This is like insert-buffer-substring except that it does not
copy any text properties.
See section Stickiness of Text Properties, for other insertion functions that inherit text properties from the nearby text in addition to inserting it. Whitespace inserted by indentation functions also inherits text properties.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes higher-level commands for inserting text, commands intended primarily for the user but useful also in Lisp programs.
This command inserts the entire accessible contents of
from-buffer-or-name (which must exist) into the current buffer
after point. It leaves the mark after the inserted text. The value
is nil.
This command inserts the last character typed; it does so count
times, before point, and returns nil. Most printing characters
are bound to this command. In routine use, self-insert-command
is the most frequently called function in Emacs, but programs rarely use
it except to install it on a keymap.
In an interactive call, count is the numeric prefix argument.
Self-insertion translates the input character through
translation-table-for-input. See section Translation of Characters.
This command calls auto-fill-function whenever that is
non-nil and the character inserted is in the table
auto-fill-chars (see section Auto Filling).
This command performs abbrev expansion if Abbrev mode is enabled and
the inserted character does not have word-constituent
syntax. (See section Abbrevs and Abbrev Expansion, and Table of Syntax Classes.) It is also
responsible for calling blink-paren-function when the inserted
character has close parenthesis syntax (see section Blinking Parentheses).
The final thing this command does is to run the hook
post-self-insert-hook. You could use this to automatically
reindent text as it is typed, for example.
Do not try substituting your own definition of
self-insert-command for the standard one. The editor command
loop handles this function specially.
This command inserts newlines into the current buffer before point. If number-of-newlines is supplied, that many newline characters are inserted.
This function calls auto-fill-function if the current column
number is greater than the value of fill-column and
number-of-newlines is nil. Typically what
auto-fill-function does is insert a newline; thus, the overall
result in this case is to insert two newlines at different places: one
at point, and another earlier in the line. newline does not
auto-fill if number-of-newlines is non-nil.
This command indents to the left margin if that is not zero. See section Margins for Filling.
The value returned is nil. In an interactive call, count
is the numeric prefix argument.
This variable controls whether overwrite mode is in effect. The value
should be overwrite-mode-textual, overwrite-mode-binary,
or nil. overwrite-mode-textual specifies textual
overwrite mode (treats newlines and tabs specially), and
overwrite-mode-binary specifies binary overwrite mode (treats
newlines and tabs like any other characters).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Deletion means removing part of the text in a buffer, without saving it in the kill ring (see section The Kill Ring). Deleted text can’t be yanked, but can be reinserted using the undo mechanism (see section Undo). Some deletion functions do save text in the kill ring in some special cases.
All of the deletion functions operate on the current buffer.
This function deletes the entire text of the current buffer
(not just the accessible portion), leaving it
empty. If the buffer is read-only, it signals a buffer-read-only
error; if some of the text in it is read-only, it signals a
text-read-only error. Otherwise, it deletes the text without
asking for any confirmation. It returns nil.
Normally, deleting a large amount of text from a buffer inhibits further
auto-saving of that buffer “because it has shrunk”. However,
erase-buffer does not do this, the idea being that the future
text is not really related to the former text, and its size should not
be compared with that of the former text.
This command deletes the text between positions start and
end in the current buffer, and returns nil. If point was
inside the deleted region, its value afterward is start.
Otherwise, point relocates with the surrounding text, as markers do.
This function deletes the text between positions start and end in the current buffer, and returns a string containing the text just deleted.
If point was inside the deleted region, its value afterward is start. Otherwise, point relocates with the surrounding text, as markers do.
This command deletes count characters directly after point, or
before point if count is negative. If killp is
non-nil, then it saves the deleted characters in the kill ring.
In an interactive call, count is the numeric prefix argument, and killp is the unprocessed prefix argument. Therefore, if a prefix argument is supplied, the text is saved in the kill ring. If no prefix argument is supplied, then one character is deleted, but not saved in the kill ring.
The value returned is always nil.
This command deletes count characters directly before point, or
after point if count is negative. If killp is
non-nil, then it saves the deleted characters in the kill ring.
In an interactive call, count is the numeric prefix argument, and killp is the unprocessed prefix argument. Therefore, if a prefix argument is supplied, the text is saved in the kill ring. If no prefix argument is supplied, then one character is deleted, but not saved in the kill ring.
The value returned is always nil.
This command deletes count characters backward, changing tabs
into spaces. When the next character to be deleted is a tab, it is
first replaced with the proper number of spaces to preserve alignment
and then one of those spaces is deleted instead of the tab. If
killp is non-nil, then the command saves the deleted
characters in the kill ring.
Conversion of tabs to spaces happens only if count is positive. If it is negative, exactly -count characters after point are deleted.
In an interactive call, count is the numeric prefix argument, and killp is the unprocessed prefix argument. Therefore, if a prefix argument is supplied, the text is saved in the kill ring. If no prefix argument is supplied, then one character is deleted, but not saved in the kill ring.
The value returned is always nil.
This option specifies how backward-delete-char-untabify should
deal with whitespace. Possible values include untabify, the
default, meaning convert a tab to many spaces and delete one;
hungry, meaning delete all tabs and spaces before point with
one command; all meaning delete all tabs, spaces and newlines
before point, and nil, meaning do nothing special for
whitespace characters.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes higher-level commands for deleting text, commands intended primarily for the user but useful also in Lisp programs.
This function deletes all spaces and tabs around point. It returns
nil.
If backward-only is non-nil, the function deletes
spaces and tabs before point, but not after point.
In the following examples, we call delete-horizontal-space four
times, once on each line, with point between the second and third
characters on the line each time.
---------- Buffer: foo ---------- I ∗thought I ∗ thought We∗ thought Yo∗u thought ---------- Buffer: foo ----------
(delete-horizontal-space) ; Four times.
⇒ nil
---------- Buffer: foo ----------
Ithought
Ithought
Wethought
You thought
---------- Buffer: foo ----------
This function joins the line point is on to the previous line, deleting
any whitespace at the join and in some cases replacing it with one
space. If join-following-p is non-nil,
delete-indentation joins this line to the following line
instead. The function returns nil.
If there is a fill prefix, and the second of the lines being joined
starts with the prefix, then delete-indentation deletes the
fill prefix before joining the lines. See section Margins for Filling.
In the example below, point is located on the line starting ‘events’, and it makes no difference if there are trailing spaces in the preceding line.
---------- Buffer: foo ---------- When in the course of human ∗ events, it becomes necessary ---------- Buffer: foo ----------
(delete-indentation)
⇒ nil
---------- Buffer: foo ---------- When in the course of human∗ events, it becomes necessary ---------- Buffer: foo ----------
After the lines are joined, the function fixup-whitespace is
responsible for deciding whether to leave a space at the junction.
This function replaces all the horizontal whitespace surrounding point
with either one space or no space, according to the context. It
returns nil.
At the beginning or end of a line, the appropriate amount of space is none. Before a character with close parenthesis syntax, or after a character with open parenthesis or expression-prefix syntax, no space is also appropriate. Otherwise, one space is appropriate. See section Table of Syntax Classes.
In the example below, fixup-whitespace is called the first time
with point before the word ‘spaces’ in the first line. For the
second invocation, point is directly after the ‘(’.
---------- Buffer: foo ---------- This has too many ∗spaces This has too many spaces at the start of (∗ this list) ---------- Buffer: foo ----------
(fixup-whitespace)
⇒ nil
(fixup-whitespace)
⇒ nil
---------- Buffer: foo ---------- This has too many spaces This has too many spaces at the start of (this list) ---------- Buffer: foo ----------
This command replaces any spaces and tabs around point with a single
space, or n spaces if n is specified. It returns
nil.
This function deletes blank lines surrounding point. If point is on a blank line with one or more blank lines before or after it, then all but one of them are deleted. If point is on an isolated blank line, then it is deleted. If point is on a nonblank line, the command deletes all blank lines immediately following it.
A blank line is defined as a line containing only tabs and spaces.
delete-blank-lines returns nil.
Delete trailing whitespace in the region defined by start and end.
This command deletes whitespace characters after the last non-whitespace character in each line in the region.
If this command acts on the entire buffer (i.e. if called
interactively with the mark inactive, or called from Lisp with
end nil), it also deletes all trailing lines at the end of the
buffer if the variable delete-trailing-lines is non-nil.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Kill functions delete text like the deletion functions, but save it so that the user can reinsert it by yanking. Most of these functions have ‘kill-’ in their name. By contrast, the functions whose names start with ‘delete-’ normally do not save text for yanking (though they can still be undone); these are “deletion” functions.
Most of the kill commands are primarily for interactive use, and are not described here. What we do describe are the functions provided for use in writing such commands. You can use these functions to write commands for killing text. When you need to delete text for internal purposes within a Lisp function, you should normally use deletion functions, so as not to disturb the kill ring contents. See section Deleting Text.
Killed text is saved for later yanking in the kill ring. This
is a list that holds a number of recent kills, not just the last text
kill. We call this a “ring” because yanking treats it as having
elements in a cyclic order. The list is kept in the variable
kill-ring, and can be operated on with the usual functions for
lists; there are also specialized functions, described in this section,
that treat it as a ring.
Some people think this use of the word “kill” is unfortunate, since it refers to operations that specifically do not destroy the entities “killed”. This is in sharp contrast to ordinary life, in which death is permanent and “killed” entities do not come back to life. Therefore, other metaphors have been proposed. For example, the term “cut ring” makes sense to people who, in pre-computer days, used scissors and paste to cut up and rearrange manuscripts. However, it would be difficult to change the terminology now.
| 31.8.1 Kill Ring Concepts | What text looks like in the kill ring. | |
| 31.8.2 Functions for Killing | Functions that kill text. | |
| 31.8.3 Yanking | How yanking is done. | |
| 31.8.4 Functions for Yanking | Commands that access the kill ring. | |
| 31.8.5 Low-Level Kill Ring | Functions and variables for kill ring access. | |
| 31.8.6 Internals of the Kill Ring | Variables that hold kill ring data. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The kill ring records killed text as strings in a list, most recent first. A short kill ring, for example, might look like this:
("some text" "a different piece of text" "even older text")
When the list reaches kill-ring-max entries in length, adding a
new entry automatically deletes the last entry.
When kill commands are interwoven with other commands, each kill command makes a new entry in the kill ring. Multiple kill commands in succession build up a single kill ring entry, which would be yanked as a unit; the second and subsequent consecutive kill commands add text to the entry made by the first one.
For yanking, one entry in the kill ring is designated the “front” of the ring. Some yank commands “rotate” the ring by designating a different element as the “front”. But this virtual rotation doesn’t change the list itself—the most recent entry always comes first in the list.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
kill-region is the usual subroutine for killing text. Any
command that calls this function is a “kill command” (and should
probably have ‘kill’ in its name). kill-region puts the
newly killed text in a new element at the beginning of the kill ring or
adds it to the most recent element. It determines automatically (using
last-command) whether the previous command was a kill command,
and if so appends the killed text to the most recent entry.
This function kills the text in the region defined by start and
end. The text is deleted but saved in the kill ring, along with
its text properties. The value is always nil.
In an interactive call, start and end are point and the mark.
If the buffer or text is read-only, kill-region modifies the kill
ring just the same, then signals an error without modifying the buffer.
This is convenient because it lets the user use a series of kill
commands to copy text from a read-only buffer into the kill ring.
If this option is non-nil, kill-region does not signal an
error if the buffer or text is read-only. Instead, it simply returns,
updating the kill ring but not changing the buffer.
This command saves the region defined by start and end on
the kill ring (including text properties), but does not delete the text
from the buffer. It returns nil.
The command does not set this-command to kill-region, so a
subsequent kill command does not append to the same kill ring entry.
In Lisp programs, it is better to use kill-new or
kill-append instead of this command. See section Low-Level Kill Ring.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Yanking means inserting text from the kill ring, but it does not
insert the text blindly. The yank command, and related
commands, use insert-for-yank to perform special processing on
the text before it is inserted.
This function works like insert, except that it processes the
text in string according to the yank-handler text
property, as well as the variables yank-handled-properties and
yank-excluded-properties (see below), before inserting the
result into the current buffer.
This function resembles insert-buffer-substring, except that it
processes the text according to yank-handled-properties and
yank-excluded-properties. (It does not handle the
yank-handler property, which does not normally occur in buffer
text anyway.)
If you put a yank-handler text property on all or part of a
string, that alters how insert-for-yank inserts the string. If
different parts of the string have different yank-handler
values (comparison being done with eq), each substring is
handled separately. The property value must be a list of one to four
elements, with the following format (where elements after the first
may be omitted):
(function param noexclude undo)
Here is what the elements do:
When function is non-nil, it is called instead of
insert to insert the string, with one argument—the string to
insert.
If param is present and non-nil, it replaces string
(or the substring of string being processed) as the object
passed to function (or insert). For example, if
function is yank-rectangle, param should be a list
of strings to insert as a rectangle.
If noexclude is present and non-nil, that disables the
normal action of yank-handled-properties and
yank-excluded-properties on the inserted string.
If undo is present and non-nil, it is a function that will be
called by yank-pop to undo the insertion of the current object.
It is called with two arguments, the start and end of the current
region. function can set yank-undo-function to override
the undo value.
This variable specifies special text property handling conditions for
yanked text. It takes effect after the text has been inserted (either
normally, or via the yank-handler property), and prior to
yank-excluded-properties taking effect.
The value should be an alist of elements (prop
. fun). Each alist element is handled in order. The inserted
text is scanned for stretches of text having text properties eq
to prop; for each such stretch, fun is called with three
arguments: the value of the property, and the start and end positions
of the text.
The value of this variable is the list of properties to remove from
inserted text. Its default value contains properties that might lead
to annoying results, such as causing the text to respond to the mouse
or specifying key bindings. It takes effect after
yank-handled-properties.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes higher-level commands for yanking, which are
intended primarily for the user but useful also in Lisp programs.
Both yank and yank-pop honor the
yank-excluded-properties variable and yank-handler text
property (see section Yanking).
This command inserts before point the text at the front of the kill
ring. It sets the mark at the beginning of that text, using
push-mark (see section The Mark), and puts point at the end.
If arg is a non-nil list (which occurs interactively when
the user types C-u with no digits), then yank inserts the
text as described above, but puts point before the yanked text and
sets the mark after it.
If arg is a number, then yank inserts the argth
most recently killed text—the argth element of the kill ring
list, counted cyclically from the front, which is considered the
first element for this purpose.
yank does not alter the contents of the kill ring, unless it
used text provided by another program, in which case it pushes that text
onto the kill ring. However if arg is an integer different from
one, it rotates the kill ring to place the yanked string at the front.
yank returns nil.
This command replaces the just-yanked entry from the kill ring with a different entry from the kill ring.
This is allowed only immediately after a yank or another
yank-pop. At such a time, the region contains text that was just
inserted by yanking. yank-pop deletes that text and inserts in
its place a different piece of killed text. It does not add the deleted
text to the kill ring, since it is already in the kill ring somewhere.
It does however rotate the kill ring to place the newly yanked string at
the front.
If arg is nil, then the replacement text is the previous
element of the kill ring. If arg is numeric, the replacement is
the argth previous kill. If arg is negative, a more recent
kill is the replacement.
The sequence of kills in the kill ring wraps around, so that after the oldest one comes the newest one, and before the newest one goes the oldest.
The return value is always nil.
If this variable is non-nil, the function yank-pop uses
its value instead of delete-region to delete the text
inserted by the previous yank or
yank-pop command. The value must be a function of two
arguments, the start and end of the current region.
The function insert-for-yank automatically sets this variable
according to the undo element of the yank-handler
text property, if there is one.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These functions and variables provide access to the kill ring at a lower level, but are still convenient for use in Lisp programs, because they take care of interaction with window system selections (see section Window System Selections).
The function current-kill rotates the yanking pointer, which
designates the “front” of the kill ring, by n places (from newer
kills to older ones), and returns the text at that place in the ring.
If the optional second argument do-not-move is non-nil,
then current-kill doesn’t alter the yanking pointer; it just
returns the nth kill, counting from the current yanking pointer.
If n is zero, indicating a request for the latest kill,
current-kill calls the value of
interprogram-paste-function (documented below) before
consulting the kill ring. If that value is a function and calling it
returns a string or a list of several string, current-kill
pushes the strings onto the kill ring and returns the first string.
It also sets the yanking pointer to point to the kill-ring entry of
the first string returned by interprogram-paste-function,
regardless of the value of do-not-move. Otherwise,
current-kill does not treat a zero value for n specially:
it returns the entry pointed at by the yanking pointer and does not
move the yanking pointer.
This function pushes the text string onto the kill ring and
makes the yanking pointer point to it. It discards the oldest entry
if appropriate. It also invokes the value of
interprogram-cut-function (see below).
If replace is non-nil, then kill-new replaces the
first element of the kill ring with string, rather than pushing
string onto the kill ring.
This function appends the text string to the first entry in the
kill ring and makes the yanking pointer point to the combined entry.
Normally string goes at the end of the entry, but if
before-p is non-nil, it goes at the beginning. This
function also invokes the value of interprogram-cut-function
(see below).
This variable provides a way of transferring killed text from other
programs, when you are using a window system. Its value should be
nil or a function of no arguments.
If the value is a function, current-kill calls it to get the
“most recent kill”. If the function returns a non-nil value,
then that value is used as the “most recent kill”. If it returns
nil, then the front of the kill ring is used.
To facilitate support for window systems that support multiple
selections, this function may also return a list of strings. In that
case, the first string is used as the “most recent kill”, and all
the other strings are pushed onto the kill ring, for easy access by
yank-pop.
The normal use of this function is to get the window system’s
clipboard as the most recent kill, even if the selection belongs to
another application. See section Window System Selections. However, if
the clipboard contents come from the current Emacs session, this
function should return nil.
This variable provides a way of communicating killed text to other
programs, when you are using a window system. Its value should be
nil or a function of one required argument.
If the value is a function, kill-new and kill-append call
it with the new first element of the kill ring as the argument.
The normal use of this function is to put newly killed text in the window system’s clipboard. See section Window System Selections.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The variable kill-ring holds the kill ring contents, in the
form of a list of strings. The most recent kill is always at the front
of the list.
The kill-ring-yank-pointer variable points to a link in the
kill ring list, whose CAR is the text to yank next. We say it
identifies the “front” of the ring. Moving
kill-ring-yank-pointer to a different link is called
rotating the kill ring. We call the kill ring a “ring” because
the functions that move the yank pointer wrap around from the end of the
list to the beginning, or vice-versa. Rotation of the kill ring is
virtual; it does not change the value of kill-ring.
Both kill-ring and kill-ring-yank-pointer are Lisp
variables whose values are normally lists. The word “pointer” in the
name of the kill-ring-yank-pointer indicates that the variable’s
purpose is to identify one element of the list for use by the next yank
command.
The value of kill-ring-yank-pointer is always eq to one
of the links in the kill ring list. The element it identifies is the
CAR of that link. Kill commands, which change the kill ring, also
set this variable to the value of kill-ring. The effect is to
rotate the ring so that the newly killed text is at the front.
Here is a diagram that shows the variable kill-ring-yank-pointer
pointing to the second entry in the kill ring ("some text" "a
different piece of text" "yet older text").
kill-ring ---- kill-ring-yank-pointer
| |
| v
| --- --- --- --- --- ---
--> | | |------> | | |--> | | |--> nil
--- --- --- --- --- ---
| | |
| | |
| | -->"yet older text"
| |
| --> "a different piece of text"
|
--> "some text"
This state of affairs might occur after C-y (yank)
immediately followed by M-y (yank-pop).
This variable holds the list of killed text sequences, most recently killed first.
This variable’s value indicates which element of the kill ring is at the
“front” of the ring for yanking. More precisely, the value is a tail
of the value of kill-ring, and its CAR is the kill string
that C-y should yank.
The value of this variable is the maximum length to which the kill
ring can grow, before elements are thrown away at the end. The default
value for kill-ring-max is 60.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Most buffers have an undo list, which records all changes made
to the buffer’s text so that they can be undone. (The buffers that
don’t have one are usually special-purpose buffers for which Emacs
assumes that undoing is not useful. In particular, any buffer whose
name begins with a space has its undo recording off by default;
see Buffer Names.) All the primitives that modify the
text in the buffer automatically add elements to the front of the undo
list, which is in the variable buffer-undo-list.
This buffer-local variable’s value is the undo list of the current
buffer. A value of t disables the recording of undo information.
Here are the kinds of elements an undo list can have:
positionThis kind of element records a previous value of point; undoing this element moves point to position. Ordinary cursor motion does not make any sort of undo record, but deletion operations use these entries to record where point was before the command.
(beg . end)This kind of element indicates how to delete text that was inserted. Upon insertion, the text occupied the range beg–end in the buffer.
(text . position)This kind of element indicates how to reinsert text that was deleted.
The deleted text itself is the string text. The place to
reinsert it is (abs position). If position is
positive, point was at the beginning of the deleted text, otherwise it
was at the end. Zero or more (marker . adjustment)
elements follow immediately after this element.
(t . time-flag)This kind of element indicates that an unmodified buffer became
modified. A time-flag of the form
(sec-high sec-low microsec
picosec) represents the visited file’s modification time as of
when it was previously visited or saved, using the same format as
current-time; see Time of Day.
A time-flag of 0 means the buffer does not correspond to any file;
-1 means the visited file previously did not exist.
primitive-undo uses these
values to determine whether to mark the buffer as unmodified once again;
it does so only if the file’s status matches that of time-flag.
(nil property value beg . end)This kind of element records a change in a text property. Here’s how you might undo the change:
(put-text-property beg end property value)
(marker . adjustment)This kind of element records the fact that the marker marker was relocated due to deletion of surrounding text, and that it moved adjustment character positions. If the marker’s location is consistent with the (text . position) element preceding it in the undo list, then undoing this element moves marker - adjustment characters.
(apply funname . args)This is an extensible undo item, which is undone by calling funname with arguments args.
(apply delta beg end funname . args)This is an extensible undo item, which records a change limited to the range beg to end, which increased the size of the buffer by delta characters. It is undone by calling funname with arguments args.
This kind of element enables undo limited to a region to determine whether the element pertains to that region.
nilThis element is a boundary. The elements between two boundaries are called a change group; normally, each change group corresponds to one keyboard command, and undo commands normally undo an entire group as a unit.
This function places a boundary element in the undo list. The undo
command stops at such a boundary, and successive undo commands undo
to earlier and earlier boundaries. This function returns nil.
The editor command loop automatically calls undo-boundary just
before executing each key sequence, so that each undo normally undoes
the effects of one command. As an exception, the command
self-insert-command, which produces self-inserting input
characters (see section User-Level Insertion Commands), may remove the boundary
inserted by the command loop: a boundary is accepted for the first
such character, the next 19 consecutive self-inserting input
characters do not have boundaries, and then the 20th does; and so on
as long as the self-inserting characters continue. Hence, sequences
of consecutive character insertions can be undone as a group.
All buffer modifications add a boundary whenever the previous undoable change was made in some other buffer. This is to ensure that each command makes a boundary in each buffer where it makes changes.
Calling this function explicitly is useful for splitting the effects of
a command into more than one unit. For example, query-replace
calls undo-boundary after each replacement, so that the user can
undo individual replacements one by one.
This variable is normally nil, but the undo commands bind it to
t. This is so that various kinds of change hooks can tell when
they’re being called for the sake of undoing.
This is the basic function for undoing elements of an undo list. It undoes the first count elements of list, returning the rest of list.
primitive-undo adds elements to the buffer’s undo list when it
changes the buffer. Undo commands avoid confusion by saving the undo
list value at the beginning of a sequence of undo operations. Then the
undo operations use and update the saved value. The new elements added
by undoing are not part of this saved value, so they don’t interfere with
continuing to undo.
This function does not bind undo-in-progress.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes how to enable and disable undo information for a given buffer. It also explains how the undo list is truncated automatically so it doesn’t get too big.
Recording of undo information in a newly created buffer is normally
enabled to start with; but if the buffer name starts with a space, the
undo recording is initially disabled. You can explicitly enable or
disable undo recording with the following two functions, or by setting
buffer-undo-list yourself.
This command enables recording undo information for buffer
buffer-or-name, so that subsequent changes can be undone. If no
argument is supplied, then the current buffer is used. This function
does nothing if undo recording is already enabled in the buffer. It
returns nil.
In an interactive call, buffer-or-name is the current buffer. You cannot specify any other buffer.
This function discards the undo list of buffer-or-name, and disables further recording of undo information. As a result, it is no longer possible to undo either previous changes or any subsequent changes. If the undo list of buffer-or-name is already disabled, this function has no effect.
In an interactive call, BUFFER-OR-NAME is the current buffer. You
cannot specify any other buffer. This function returns nil.
As editing continues, undo lists get longer and longer. To prevent
them from using up all available memory space, garbage collection trims
them back to size limits you can set. (For this purpose, the “size”
of an undo list measures the cons cells that make up the list, plus the
strings of deleted text.) Three variables control the range of acceptable
sizes: undo-limit, undo-strong-limit and
undo-outer-limit. In these variables, size is counted as the
number of bytes occupied, which includes both saved text and other
data.
This is the soft limit for the acceptable size of an undo list. The change group at which this size is exceeded is the last one kept.
This is the upper limit for the acceptable size of an undo list. The
change group at which this size is exceeded is discarded itself (along
with all older change groups). There is one exception: the very latest
change group is only discarded if it exceeds undo-outer-limit.
If at garbage collection time the undo info for the current command exceeds this limit, Emacs discards the info and displays a warning. This is a last ditch limit to prevent memory overflow.
If this variable is non-nil, when the undo info exceeds
undo-outer-limit, Emacs asks in the echo area whether to
discard the info. The default value is nil, which means to
discard it automatically.
This option is mainly intended for debugging. Garbage collection is inhibited while the question is asked, which means that Emacs might leak memory if the user waits too long before answering the question.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Filling means adjusting the lengths of lines (by moving the line
breaks) so that they are nearly (but no greater than) a specified
maximum width. Additionally, lines can be justified, which means
inserting spaces to make the left and/or right margins line up
precisely. The width is controlled by the variable fill-column.
For ease of reading, lines should be no longer than 70 or so columns.
You can use Auto Fill mode (see section Auto Filling) to fill text automatically as you insert it, but changes to existing text may leave it improperly filled. Then you must fill the text explicitly.
Most of the commands in this section return values that are not
meaningful. All the functions that do filling take note of the current
left margin, current right margin, and current justification style
(see section Margins for Filling). If the current justification style is
none, the filling functions don’t actually do anything.
Several of the filling functions have an argument justify.
If it is non-nil, that requests some kind of justification. It
can be left, right, full, or center, to
request a specific style of justification. If it is t, that
means to use the current justification style for this part of the text
(see current-justification, below). Any other value is treated
as full.
When you call the filling functions interactively, using a prefix
argument implies the value full for justify.
This command fills the paragraph at or after point. If
justify is non-nil, each line is justified as well.
It uses the ordinary paragraph motion commands to find paragraph
boundaries. See Paragraphs in The GNU Emacs Manual.
When region is non-nil, then if Transient Mark mode is
enabled and the mark is active, this command calls fill-region
to fill all the paragraphs in the region, instead of filling only the
current paragraph. When this command is called interactively,
region is t.
This command fills each of the paragraphs in the region from start
to end. It justifies as well if justify is
non-nil.
If nosqueeze is non-nil, that means to leave whitespace
other than line breaks untouched. If to-eop is non-nil,
that means to keep filling to the end of the paragraph—or the next hard
newline, if use-hard-newlines is enabled (see below).
The variable paragraph-separate controls how to distinguish
paragraphs. See section Standard Regular Expressions Used in Editing.
This command fills each paragraph in the region according to its individual fill prefix. Thus, if the lines of a paragraph were indented with spaces, the filled paragraph will remain indented in the same fashion.
The first two arguments, start and end, are the beginning
and end of the region to be filled. The third and fourth arguments,
justify and citation-regexp, are optional. If
justify is non-nil, the paragraphs are justified as
well as filled. If citation-regexp is non-nil, it means the
function is operating on a mail message and therefore should not fill
the header lines. If citation-regexp is a string, it is used as
a regular expression; if it matches the beginning of a line, that line
is treated as a citation marker.
Ordinarily, fill-individual-paragraphs regards each change in
indentation as starting a new paragraph. If
fill-individual-varying-indent is non-nil, then only
separator lines separate paragraphs. That mode can handle indented
paragraphs with additional indentation on the first line.
This variable alters the action of fill-individual-paragraphs as
described above.
This command considers a region of text as a single paragraph and fills
it. If the region was made up of many paragraphs, the blank lines
between paragraphs are removed. This function justifies as well as
filling when justify is non-nil.
If nosqueeze is non-nil, that means to leave whitespace
other than line breaks untouched. If squeeze-after is
non-nil, it specifies a position in the region, and means don’t
canonicalize spaces before that position.
In Adaptive Fill mode, this command calls fill-context-prefix to
choose a fill prefix by default. See section Adaptive Fill Mode.
This command inserts spaces between the words of the current line so
that the line ends exactly at fill-column. It returns
nil.
The argument how, if non-nil specifies explicitly the style
of justification. It can be left, right, full,
center, or none. If it is t, that means to do
follow specified justification style (see current-justification,
below). nil means to do full justification.
If eop is non-nil, that means do only left-justification
if current-justification specifies full justification. This is
used for the last line of a paragraph; even if the paragraph as a
whole is fully justified, the last line should not be.
If nosqueeze is non-nil, that means do not change interior
whitespace.
This variable’s value specifies the style of justification to use for
text that doesn’t specify a style with a text property. The possible
values are left, right, full, center, or
none. The default value is left.
This function returns the proper justification style to use for filling the text around point.
This returns the value of the justification text property at
point, or the variable default-justification if there is no such
text property. However, it returns nil rather than none
to mean “don’t justify”.
If this variable is non-nil, a period followed by just one space
does not count as the end of a sentence, and the filling functions
avoid breaking the line at such a place.
If this variable is non-nil, a sentence can end without a
period. This is used for languages like Thai, where sentences end
with a double space but without a period.
If this variable is non-nil, it should be a string of
characters that can end a sentence without following spaces.
This variable provides a way to override the filling of paragraphs.
If its value is non-nil, fill-paragraph calls this
function to do the work. If the function returns a non-nil
value, fill-paragraph assumes the job is done, and immediately
returns that value.
The usual use of this feature is to fill comments in programming language modes. If the function needs to fill a paragraph in the usual way, it can do so as follows:
(let ((fill-paragraph-function nil)) (fill-paragraph arg))
This variable provides a way to override how the filling functions,
such as fill-region and fill-paragraph, move forward to
the next paragraph. Its value should be a function, which is called
with a single argument n, the number of paragraphs to move, and
should return the difference between n and the number of
paragraphs actually moved. The default value of this variable is
forward-paragraph. See Paragraphs in The GNU Emacs
Manual.
If this variable is non-nil, the filling functions do not delete
newlines that have the hard text property. These “hard
newlines” act as paragraph separators. See Hard and Soft Newlines in The GNU Emacs Manual.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This buffer-local variable, if non-nil, specifies a string of
text that appears at the beginning of normal text lines and should be
disregarded when filling them. Any line that fails to start with the
fill prefix is considered the start of a paragraph; so is any line
that starts with the fill prefix followed by additional whitespace.
Lines that start with the fill prefix but no additional whitespace are
ordinary text lines that can be filled together. The resulting filled
lines also start with the fill prefix.
The fill prefix follows the left margin whitespace, if any.
This buffer-local variable specifies the maximum width of filled lines. Its value should be an integer, which is a number of columns. All the filling, justification, and centering commands are affected by this variable, including Auto Fill mode (see section Auto Filling).
As a practical matter, if you are writing text for other people to
read, you should set fill-column to no more than 70. Otherwise
the line will be too long for people to read comfortably, and this can
make the text seem clumsy.
The default value for fill-column is 70.
This sets the left-margin property on the text from from to
to to the value margin. If Auto Fill mode is enabled, this
command also refills the region to fit the new margin.
This sets the right-margin property on the text from from
to to to the value margin. If Auto Fill mode is enabled,
this command also refills the region to fit the new margin.
This function returns the proper left margin value to use for filling
the text around point. The value is the sum of the left-margin
property of the character at the start of the current line (or zero if
none), and the value of the variable left-margin.
This function returns the proper fill column value to use for filling
the text around point. The value is the value of the fill-column
variable, minus the value of the right-margin property of the
character after point.
This function moves point to the left margin of the current line. The
column moved to is determined by calling the function
current-left-margin. If the argument n is non-nil,
move-to-left-margin moves forward n-1 lines first.
If force is non-nil, that says to fix the line’s
indentation if that doesn’t match the left margin value.
This function removes left margin indentation from the text between
from and to. The amount of indentation to delete is
determined by calling current-left-margin. In no case does this
function delete non-whitespace. If from and to are omitted,
they default to the whole buffer.
This function adjusts the indentation at the beginning of the current
line to the value specified by the variable left-margin. (That
may involve either inserting or deleting whitespace.) This function
is value of indent-line-function in Paragraph-Indent Text mode.
This variable specifies the base left margin column. In Fundamental mode, RET indents to this column. This variable automatically becomes buffer-local when set in any fashion.
This variable gives major modes a way to specify not to break a line
at certain places. Its value should be a list of functions. Whenever
filling considers breaking the line at a certain place in the buffer,
it calls each of these functions with no arguments and with point
located at that place. If any of the functions returns
non-nil, then the line won’t be broken there.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When Adaptive Fill Mode is enabled, Emacs determines the fill prefix automatically from the text in each paragraph being filled rather than using a predetermined value. During filling, this fill prefix gets inserted at the start of the second and subsequent lines of the paragraph as described in Filling, and in Auto Filling.
Adaptive Fill mode is enabled when this variable is non-nil.
It is t by default.
This function implements the heart of Adaptive Fill mode; it chooses a fill prefix based on the text between from and to, typically the start and end of a paragraph. It does this by looking at the first two lines of the paragraph, based on the variables described below.
Usually, this function returns the fill prefix, a string. However,
before doing this, the function makes a final check (not specially
mentioned in the following) that a line starting with this prefix
wouldn’t look like the start of a paragraph. Should this happen, the
function signals the anomaly by returning nil instead.
In detail, fill-context-prefix does this:
adaptive-fill-function (if any),
then the regular expression adaptive-fill-regexp (see below).
The first non-nil result of these, or the empty string if
they’re both nil, becomes the first line’s candidate.
adaptive-fill-first-line-regexp below).
nil.
Adaptive Fill mode matches this regular expression against the text starting after the left margin whitespace (if any) on a line; the characters it matches are that line’s candidate for the fill prefix.
The default value matches whitespace with certain punctuation characters intermingled.
Used only in one-line paragraphs, this regular expression acts as an
additional check of the validity of the one available candidate fill
prefix: the candidate must match this regular expression, or match
comment-start-skip. If it doesn’t, fill-context-prefix
replaces the candidate with a string of spaces “of the same width”
as it.
The default value of this variable is "\\`[ \t]*\\'", which
matches only a string of whitespace. The effect of this default is to
force the fill prefixes found in one-line paragraphs always to be pure
whitespace.
You can specify more complex ways of choosing a fill prefix
automatically by setting this variable to a function. The function is
called with point after the left margin (if any) of a line, and it
must preserve point. It should return either “that line’s” fill
prefix or nil, meaning it has failed to determine a prefix.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Auto Fill mode is a minor mode that fills lines automatically as text is inserted. This section describes the hook used by Auto Fill mode. For a description of functions that you can call explicitly to fill and justify existing text, see Filling.
Auto Fill mode also enables the functions that change the margins and justification style to refill portions of the text. See section Margins for Filling.
The value of this buffer-local variable should be a function (of no
arguments) to be called after self-inserting a character from the table
auto-fill-chars. It may be nil, in which case nothing
special is done in that case.
The value of auto-fill-function is do-auto-fill when
Auto-Fill mode is enabled. That is a function whose sole purpose is to
implement the usual strategy for breaking a line.
This variable specifies the function to use for
auto-fill-function, if and when Auto Fill is turned on. Major
modes can set buffer-local values for this variable to alter how Auto
Fill works.
A char table of characters which invoke auto-fill-function when
self-inserted—space and newline in most language environments. They
have an entry t in the table.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The sorting functions described in this section all rearrange text in
a buffer. This is in contrast to the function sort, which
rearranges the order of the elements of a list (see section Functions that Rearrange Lists).
The values returned by these functions are not meaningful.
This function is the general text-sorting routine that subdivides a buffer into records and then sorts them. Most of the commands in this section use this function.
To understand how sort-subr works, consider the whole accessible
portion of the buffer as being divided into disjoint pieces called
sort records. The records may or may not be contiguous, but they
must not overlap. A portion of each sort record (perhaps all of it) is
designated as the sort key. Sorting rearranges the records in order by
their sort keys.
Usually, the records are rearranged in order of ascending sort key.
If the first argument to the sort-subr function, reverse,
is non-nil, the sort records are rearranged in order of
descending sort key.
The next four arguments to sort-subr are functions that are
called to move point across a sort record. They are called many times
from within sort-subr.
sort-subr is
called. Therefore, you should usually move point to the beginning of
the buffer before calling sort-subr.
This function can indicate there are no more sort records by leaving point at the end of the buffer.
nil value to be used as the sort key, or
return nil to indicate that the sort key is in the buffer
starting at point. In the latter case, endkeyfun is called to
find the end of the sort key.
nil and this argument is omitted (or
nil), then the sort key extends to the end of the record. There
is no need for endkeyfun if startkeyfun returns a
non-nil value.
The argument predicate is the function to use to compare keys.
If keys are numbers, it defaults to <; otherwise it defaults to
string<.
As an example of sort-subr, here is the complete function
definition for sort-lines:
;; Note that the first two lines of doc string ;; are effectively one line when viewed by a user. (defun sort-lines (reverse beg end) "Sort lines in region alphabetically;\ argument means descending order. Called from a program, there are three arguments:
REVERSE (non-nil means reverse order),\ BEG and END (region to sort). The variable `sort-fold-case' determines\ whether alphabetic case affects the sort order."
(interactive "P\nr")
(save-excursion
(save-restriction
(narrow-to-region beg end)
(goto-char (point-min))
(let ((inhibit-field-text-motion t))
(sort-subr reverse 'forward-line 'end-of-line)))))
Here forward-line moves point to the start of the next record,
and end-of-line moves point to the end of record. We do not pass
the arguments startkeyfun and endkeyfun, because the entire
record is used as the sort key.
The sort-paragraphs function is very much the same, except that
its sort-subr call looks like this:
(sort-subr reverse
(function
(lambda ()
(while (and (not (eobp))
(looking-at paragraph-separate))
(forward-line 1))))
'forward-paragraph)
Markers pointing into any sort records are left with no useful
position after sort-subr returns.
If this variable is non-nil, sort-subr and the other
buffer sorting functions ignore case when comparing strings.
This command sorts the region between start and end alphabetically as specified by record-regexp and key-regexp. If reverse is a negative integer, then sorting is in reverse order.
Alphabetical sorting means that two sort keys are compared by comparing the first characters of each, the second characters of each, and so on. If a mismatch is found, it means that the sort keys are unequal; the sort key whose character is less at the point of first mismatch is the lesser sort key. The individual characters are compared according to their numerical character codes in the Emacs character set.
The value of the record-regexp argument specifies how to divide the buffer into sort records. At the end of each record, a search is done for this regular expression, and the text that matches it is taken as the next record. For example, the regular expression ‘^.+$’, which matches lines with at least one character besides a newline, would make each such line into a sort record. See section Regular Expressions, for a description of the syntax and meaning of regular expressions.
The value of the key-regexp argument specifies what part of each record is the sort key. The key-regexp could match the whole record, or only a part. In the latter case, the rest of the record has no effect on the sorted order of records, but it is carried along when the record moves to its new position.
The key-regexp argument can refer to the text matched by a subexpression of record-regexp, or it can be a regular expression on its own.
If key-regexp is:
then the text matched by the digitth ‘\(...\)’ parenthesis grouping in record-regexp is the sort key.
then the whole record is the sort key.
then sort-regexp-fields searches for a match for the regular
expression within the record. If such a match is found, it is the sort
key. If there is no match for key-regexp within a record then
that record is ignored, which means its position in the buffer is not
changed. (The other records may move around it.)
For example, if you plan to sort all the lines in the region by the first word on each line starting with the letter ‘f’, you should set record-regexp to ‘^.*$’ and set key-regexp to ‘\<f\w*\>’. The resulting expression looks like this:
(sort-regexp-fields nil "^.*$" "\\<f\\w*\\>"
(region-beginning)
(region-end))
If you call sort-regexp-fields interactively, it prompts for
record-regexp and key-regexp in the minibuffer.
This command alphabetically sorts lines in the region between
start and end. If reverse is non-nil, the sort
is in reverse order.
This command alphabetically sorts paragraphs in the region between
start and end. If reverse is non-nil, the sort
is in reverse order.
This command alphabetically sorts pages in the region between
start and end. If reverse is non-nil, the sort
is in reverse order.
This command sorts lines in the region between start and end, comparing them alphabetically by the fieldth field of each line. Fields are separated by whitespace and numbered starting from 1. If field is negative, sorting is by the -fieldth field from the end of the line. This command is useful for sorting tables.
This command sorts lines in the region between start and end, comparing them numerically by the fieldth field of each line. Fields are separated by whitespace and numbered starting from 1. The specified field must contain a number in each line of the region. Numbers starting with 0 are treated as octal, and numbers starting with ‘0x’ are treated as hexadecimal.
If field is negative, sorting is by the -fieldth field from the end of the line. This command is useful for sorting tables.
This variable specifies the default radix for
sort-numeric-fields to parse numbers.
This command sorts the lines in the region between beg and end, comparing them alphabetically by a certain range of columns. The column positions of beg and end bound the range of columns to sort on.
If reverse is non-nil, the sort is in reverse order.
One unusual thing about this command is that the entire line containing position beg, and the entire line containing position end, are included in the region sorted.
Note that sort-columns rejects text that contains tabs, because
tabs could be split across the specified columns. Use M-x
untabify to convert tabs to spaces before sorting.
When possible, this command actually works by calling the sort
utility program.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The column functions convert between a character position (counting characters from the beginning of the buffer) and a column position (counting screen characters from the beginning of a line).
These functions count each character according to the number of
columns it occupies on the screen. This means control characters count
as occupying 2 or 4 columns, depending upon the value of
ctl-arrow, and tabs count as occupying a number of columns that
depends on the value of tab-width and on the column where the tab
begins. See section Usual Display Conventions.
Column number computations ignore the width of the window and the amount of horizontal scrolling. Consequently, a column value can be arbitrarily high. The first (or leftmost) column is numbered 0. They also ignore overlays and text properties, aside from invisibility.
This function returns the horizontal position of point, measured in columns, counting from 0 at the left margin. The column position is the sum of the widths of all the displayed representations of the characters between the start of the current line and point.
For an example of using current-column, see the description of
count-lines in Motion by Text Lines.
This function moves point to column in the current line. The calculation of column takes into account the widths of the displayed representations of the characters between the start of the line and point.
When called interactively, column is the value of prefix numeric argument. If column is not an integer, an error is signaled.
If it is impossible to move to column column because that is in
the middle of a multicolumn character such as a tab, point moves to the
end of that character. However, if force is non-nil, and
column is in the middle of a tab, then move-to-column
converts the tab into spaces so that it can move precisely to column
column. Other multicolumn characters can cause anomalies despite
force, since there is no way to split them.
The argument force also has an effect if the line isn’t long
enough to reach column column; if it is t, that means to
add whitespace at the end of the line to reach that column.
The return value is the column number actually moved to.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The indentation functions are used to examine, move to, and change whitespace that is at the beginning of a line. Some of the functions can also change whitespace elsewhere on a line. Columns and indentation count from zero at the left margin.
| 31.17.1 Indentation Primitives | Functions used to count and insert indentation. | |
| 31.17.2 Indentation Controlled by Major Mode | Customize indentation for different modes. | |
| 31.17.3 Indenting an Entire Region | Indent all the lines in a region. | |
| 31.17.4 Indentation Relative to Previous Lines | Indent the current line based on previous lines. | |
| 31.17.5 Adjustable “Tab Stops” | Adjustable, typewriter-like tab stops. | |
| 31.17.6 Indentation-Based Motion Commands | Move to first non-blank character. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes the primitive functions used to count and insert indentation. The functions in the following sections use these primitives. See section Size of Displayed Text, for related functions.
This function returns the indentation of the current line, which is the horizontal position of the first nonblank character. If the contents are entirely blank, then this is the horizontal position of the end of the line.
This function indents from point with tabs and spaces until column
is reached. If minimum is specified and non-nil, then at
least that many spaces are inserted even if this requires going beyond
column. Otherwise the function does nothing if point is already
beyond column. The value is the column at which the inserted
indentation ends.
The inserted whitespace characters inherit text properties from the surrounding text (usually, from the preceding text only). See section Stickiness of Text Properties.
If this variable is non-nil, indentation functions can insert
tabs as well as spaces. Otherwise, they insert only spaces. Setting
this variable automatically makes it buffer-local in the current buffer.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
An important function of each major mode is to customize the TAB key to indent properly for the language being edited. This section describes the mechanism of the TAB key and how to control it. The functions in this section return unpredictable values.
This is the command bound to TAB in most editing modes. Its usual action is to indent the current line, but it can alternatively insert a tab character or indent a region.
Here is what it does:
indent-region to indent all the
text in the region (see section Indenting an Entire Region).
indent-line-function
is indent-to-left-margin (a trivial command that inserts a tab
character), or if the variable tab-always-indent specifies that
a tab character ought to be inserted (see below), then it inserts a
tab character.
indent-line-function. If the line is already
indented, and the value of tab-always-indent is complete
(see below), it tries completing the text at point.
If rigid is non-nil (interactively, with a prefix
argument), then after this command indents a line or inserts a tab, it
also rigidly indents the entire balanced expression which starts at
the beginning of the current line, in order to reflect the new
indentation. This argument is ignored if the command indents the
region.
This variable’s value is the function to be used by
indent-for-tab-command, and various other indentation commands,
to indent the current line. It is usually assigned by the major mode;
for instance, Lisp mode sets it to lisp-indent-line, C mode
sets it to c-indent-line, and so on. The default value is
indent-relative. See section Automatic Indentation of code.
This command calls the function in indent-line-function to
indent the current line in a way appropriate for the current major mode.
This function inserts a newline, then indents the new line (the one
following the newline just inserted) according to the major mode. It
does indentation by calling indent-according-to-mode.
This command reindents the current line, inserts a newline at point,
and then indents the new line (the one following the newline just
inserted). It does indentation on both lines by calling
indent-according-to-mode.
This variable can be used to customize the behavior of the TAB
(indent-for-tab-command) command. If the value is t
(the default), the command normally just indents the current line. If
the value is nil, the command indents the current line only if
point is at the left margin or in the line’s indentation; otherwise,
it inserts a tab character. If the value is complete, the
command first tries to indent the current line, and if the line was
already indented, it calls completion-at-point to complete the
text at point (see section Completion in Ordinary Buffers).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes commands that indent all the lines in the region. They return unpredictable values.
This command indents each nonblank line starting between start
(inclusive) and end (exclusive). If to-column is
nil, indent-region indents each nonblank line by calling
the current mode’s indentation function, the value of
indent-line-function.
If to-column is non-nil, it should be an integer
specifying the number of columns of indentation; then this function
gives each line exactly that much indentation, by either adding or
deleting whitespace.
If there is a fill prefix, indent-region indents each line
by making it start with the fill prefix.
The value of this variable is a function that can be used by
indent-region as a short cut. It should take two arguments, the
start and end of the region. You should design the function so
that it will produce the same results as indenting the lines of the
region one by one, but presumably faster.
If the value is nil, there is no short cut, and
indent-region actually works line by line.
A short-cut function is useful in modes such as C mode and Lisp mode,
where the indent-line-function must scan from the beginning of
the function definition: applying it to each line would be quadratic in
time. The short cut can update the scan information as it moves through
the lines indenting them; this takes linear time. In a mode where
indenting a line individually is fast, there is no need for a short cut.
indent-region with a non-nil argument to-column has
a different meaning and does not use this variable.
This function indents all lines starting between start (inclusive) and end (exclusive) sideways by count columns. This “preserves the shape” of the affected region, moving it as a rigid unit.
This is useful not only for indenting regions of unindented text, but also for indenting regions of formatted code. For example, if count is 3, this command adds 3 columns of indentation to every line that begins in the specified region.
If called interactively with no prefix argument, this command invokes a transient mode for adjusting indentation rigidly. See Indentation Commands in The GNU Emacs Manual.
This is like indent-rigidly, except that it doesn’t alter lines
that start within strings or comments.
In addition, it doesn’t alter a line if nochange-regexp matches at
the beginning of the line (if nochange-regexp is non-nil).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes two commands that indent the current line based on the contents of previous lines.
This command inserts whitespace at point, extending to the same column as the next indent point of the previous nonblank line. An indent point is a non-whitespace character following whitespace. The next indent point is the first one at a column greater than the current column of point. For example, if point is underneath and to the left of the first non-blank character of a line of text, it moves to that column by inserting whitespace.
If the previous nonblank line has no next indent point (i.e., none at a
great enough column position), indent-relative either does
nothing (if unindented-ok is non-nil) or calls
tab-to-tab-stop. Thus, if point is underneath and to the right
of the last column of a short line of text, this command ordinarily
moves point to the next tab stop by inserting whitespace.
The return value of indent-relative is unpredictable.
In the following example, point is at the beginning of the second line:
This line is indented twelve spaces. ∗The quick brown fox jumped.
Evaluation of the expression (indent-relative nil) produces the
following:
This line is indented twelve spaces.
∗The quick brown fox jumped.
In this next example, point is between the ‘m’ and ‘p’ of ‘jumped’:
This line is indented twelve spaces. The quick brown fox jum∗ped.
Evaluation of the expression (indent-relative nil) produces the
following:
This line is indented twelve spaces. The quick brown fox jum ∗ped.
This command indents the current line like the previous nonblank line,
by calling indent-relative with t as the
unindented-ok argument. The return value is unpredictable.
If the previous nonblank line has no indent points beyond the current column, this command does nothing.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section explains the mechanism for user-specified “tab stops” and the mechanisms that use and set them. The name “tab stops” is used because the feature is similar to that of the tab stops on a typewriter. The feature works by inserting an appropriate number of spaces and tab characters to reach the next tab stop column; it does not affect the display of tab characters in the buffer (see section Usual Display Conventions). Note that the TAB character as input uses this tab stop feature only in a few major modes, such as Text mode. See Tab Stops in The GNU Emacs Manual.
This command inserts spaces or tabs before point, up to the next tab
stop column defined by tab-stop-list.
This variable defines the tab stop columns used by tab-to-tab-stop.
It should be either nil, or a list of increasing integers,
which need not be evenly spaced. The list is implicitly
extended to infinity through repetition of the interval between the
last and penultimate elements (or tab-width if the list has
fewer than two elements). A value of nil means a tab stop
every tab-width columns.
Use M-x edit-tab-stops to edit the location of tab stops interactively.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These commands, primarily for interactive use, act based on the indentation in the text.
This command moves point to the first non-whitespace character in the
current line (which is the line in which point is located). It returns
nil.
This command moves point backward arg lines and then to the
first nonblank character on that line. It returns nil.
If arg is omitted or nil, it defaults to 1.
This command moves point forward arg lines and then to the first
nonblank character on that line. It returns nil.
If arg is omitted or nil, it defaults to 1.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The case change commands described here work on text in the current buffer. See section Case Conversion in Lisp, for case conversion functions that work on strings and characters. See section The Case Table, for how to customize which characters are upper or lower case and how to convert them.
This function capitalizes all words in the region defined by
start and end. To capitalize means to convert each word’s
first character to upper case and convert the rest of each word to lower
case. The function returns nil.
If one end of the region is in the middle of a word, the part of the word within the region is treated as an entire word.
When capitalize-region is called interactively, start and
end are point and the mark, with the smallest first.
---------- Buffer: foo ---------- This is the contents of the 5th foo. ---------- Buffer: foo ----------
(capitalize-region 1 37) ⇒ nil ---------- Buffer: foo ---------- This Is The Contents Of The 5th Foo. ---------- Buffer: foo ----------
This function converts all of the letters in the region defined by
start and end to lower case. The function returns
nil.
When downcase-region is called interactively, start and
end are point and the mark, with the smallest first.
This function converts all of the letters in the region defined by
start and end to upper case. The function returns
nil.
When upcase-region is called interactively, start and
end are point and the mark, with the smallest first.
This function capitalizes count words after point, moving point
over as it does. To capitalize means to convert each word’s first
character to upper case and convert the rest of each word to lower case.
If count is negative, the function capitalizes the
-count previous words but does not move point. The value
is nil.
If point is in the middle of a word, the part of the word before point is ignored when moving forward. The rest is treated as an entire word.
When capitalize-word is called interactively, count is
set to the numeric prefix argument.
This function converts the count words after point to all lower
case, moving point over as it does. If count is negative, it
converts the -count previous words but does not move point.
The value is nil.
When downcase-word is called interactively, count is set
to the numeric prefix argument.
This function converts the count words after point to all upper
case, moving point over as it does. If count is negative, it
converts the -count previous words but does not move point.
The value is nil.
When upcase-word is called interactively, count is set to
the numeric prefix argument.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Each character position in a buffer or a string can have a text property list, much like the property list of a symbol (see section Property Lists). The properties belong to a particular character at a particular place, such as, the letter ‘T’ at the beginning of this sentence or the first ‘o’ in ‘foo’—if the same character occurs in two different places, the two occurrences in general have different properties.
Each property has a name and a value. Both of these can be any Lisp
object, but the name is normally a symbol. Typically each property
name symbol is used for a particular purpose; for instance, the text
property face specifies the faces for displaying the character
(see section Properties with Special Meanings). The usual way to access the property
list is to specify a name and ask what value corresponds to it.
If a character has a category property, we call it the
property category of the character. It should be a symbol. The
properties of the symbol serve as defaults for the properties of the
character.
Copying text between strings and buffers preserves the properties
along with the characters; this includes such diverse functions as
substring, insert, and buffer-substring.
| 31.19.1 Examining Text Properties | Looking at the properties of one character. | |
| 31.19.2 Changing Text Properties | Setting the properties of a range of text. | |
| 31.19.3 Text Property Search Functions | Searching for where a property changes value. | |
| 31.19.4 Properties with Special Meanings | Particular properties with special meanings. | |
| 31.19.5 Formatted Text Properties | Properties for representing formatting of text. | |
| 31.19.6 Stickiness of Text Properties | How inserted text gets properties from neighboring text. | |
| 31.19.7 Lazy Computation of Text Properties | Computing text properties in a lazy fashion only when text is examined. | |
| 31.19.8 Defining Clickable Text | Using text properties to make regions of text do something when you click on them. | |
| 31.19.9 Defining and Using Fields | The field property defines
fields within the buffer.
| |
| 31.19.10 Why Text Properties are not Intervals | Why text properties do not use Lisp-visible text intervals. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The simplest way to examine text properties is to ask for the value of
a particular property of a particular character. For that, use
get-text-property. Use text-properties-at to get the
entire property list of a character. See section Text Property Search Functions, for
functions to examine the properties of a number of characters at once.
These functions handle both strings and buffers. Keep in mind that positions in a string start from 0, whereas positions in a buffer start from 1.
This function returns the value of the prop property of the character after position pos in object (a buffer or string). The argument object is optional and defaults to the current buffer.
If there is no prop property strictly speaking, but the character
has a property category that is a symbol, then get-text-property returns
the prop property of that symbol.
This function is like get-text-property, except that it checks
overlays first and then text properties. See section Overlays.
The argument object may be a string, a buffer, or a window. If it is a window, then the buffer displayed in that window is used for text properties and overlays, but only the overlays active for that window are considered. If object is a buffer, then overlays in that buffer are considered first, in order of decreasing priority, followed by the text properties. If object is a string, only text properties are considered, since strings never have overlays.
This function is like get-char-property, except that it pays
attention to properties’ stickiness and overlays’ advancement settings
instead of the property of the character at (i.e. right after)
position.
This is like get-char-property, but gives extra information
about the overlay that the property value comes from.
Its value is a cons cell whose CAR is the property value, the
same value get-char-property would return with the same
arguments. Its CDR is the overlay in which the property was
found, or nil, if it was found as a text property or not found
at all.
If position is at the end of object, both the CAR and
the CDR of the value are nil.
This variable holds an alist which maps property names to a list of
alternative property names. If a character does not specify a direct
value for a property, the alternative property names are consulted in
order; the first non-nil value is used. This variable takes
precedence over default-text-properties, and category
properties take precedence over this variable.
This function returns the entire property list of the character at
position in the string or buffer object. If object is
nil, it defaults to the current buffer.
This variable holds a property list giving default values for text
properties. Whenever a character does not specify a value for a
property, neither directly, through a category symbol, or through
char-property-alias-alist, the value stored in this list is
used instead. Here is an example:
(setq default-text-properties '(foo 69)
char-property-alias-alist nil)
;; Make sure character 1 has no properties of its own.
(set-text-properties 1 2 nil)
;; What we get, when we ask, is the default value.
(get-text-property 1 'foo)
⇒ 69
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The primitives for changing properties apply to a specified range of
text in a buffer or string. The function set-text-properties
(see end of section) sets the entire property list of the text in that
range; more often, it is useful to add, change, or delete just certain
properties specified by name.
Since text properties are considered part of the contents of the buffer (or string), and can affect how a buffer looks on the screen, any change in buffer text properties marks the buffer as modified. Buffer text property changes are undoable also (see section Undo). Positions in a string start from 0, whereas positions in a buffer start from 1.
This function sets the prop property to value for the text
between start and end in the string or buffer object.
If object is nil, it defaults to the current buffer.
This function adds or overrides text properties for the text between
start and end in the string or buffer object. If
object is nil, it defaults to the current buffer.
The argument props specifies which properties to add. It should have the form of a property list (see section Property Lists): a list whose elements include the property names followed alternately by the corresponding values.
The return value is t if the function actually changed some
property’s value; nil otherwise (if props is nil or
its values agree with those in the text).
For example, here is how to set the comment and face
properties of a range of text:
(add-text-properties start end
'(comment t face highlight))
This function deletes specified text properties from the text between
start and end in the string or buffer object. If
object is nil, it defaults to the current buffer.
The argument props specifies which properties to delete. It
should have the form of a property list (see section Property Lists): a list
whose elements are property names alternating with corresponding values.
But only the names matter—the values that accompany them are ignored.
For example, here’s how to remove the face property.
(remove-text-properties start end '(face nil))
The return value is t if the function actually changed some
property’s value; nil otherwise (if props is nil or
if no character in the specified text had any of those properties).
To remove all text properties from certain text, use
set-text-properties and specify nil for the new property
list.
Like remove-text-properties except that
list-of-properties is a list of property names only, not an
alternating list of property names and values.
This function completely replaces the text property list for the text
between start and end in the string or buffer object.
If object is nil, it defaults to the current buffer.
The argument props is the new property list. It should be a list whose elements are property names alternating with corresponding values.
After set-text-properties returns, all the characters in the
specified range have identical properties.
If props is nil, the effect is to get rid of all properties
from the specified range of text. Here’s an example:
(set-text-properties start end nil)
Do not rely on the return value of this function.
This function acts on the text between start and end,
adding the face face to the face text property.
face should be a valid value for the face property
(see section Properties with Special Meanings), such as a face name or an anonymous face
(see section Faces).
If any text in the region already has a non-nil face property,
those face(s) are retained. This function sets the face
property to a list of faces, with face as the first element (by
default) and the pre-existing faces as the remaining elements. If the
optional argument append is non-nil, face is
appended to the end of the list instead. Note that in a face list,
the first occurring value for each attribute takes precedence.
For example, the following code would assign a italicized green face to the text between start and end:
(add-face-text-property start end 'italic) (add-face-text-property start end '(:foreground "red")) (add-face-text-property start end '(:foreground "green"))
The optional argument object, if non-nil, specifies a
buffer or string to act on, rather than the current buffer. If
object is a string, then start and end are
zero-based indices into the string.
The easiest way to make a string with text properties is with
propertize:
This function returns a copy of string with the text properties
properties added. These properties apply to all the characters
in the string that is returned. Here is an example that constructs a
string with a face property and a mouse-face property:
(propertize "foo" 'face 'italic
'mouse-face 'bold-italic)
⇒ #("foo" 0 3 (mouse-face bold-italic face italic))
To put different properties on various parts of a string, you can
construct each part with propertize and then combine them with
concat:
(concat
(propertize "foo" 'face 'italic
'mouse-face 'bold-italic)
" and "
(propertize "bar" 'face 'italic
'mouse-face 'bold-italic))
⇒ #("foo and bar"
0 3 (face italic mouse-face bold-italic)
3 8 nil
8 11 (face italic mouse-face bold-italic))
See section Examining Buffer Contents, for the function
buffer-substring-no-properties, which copies text from the
buffer but does not copy its properties.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In typical use of text properties, most of the time several or many consecutive characters have the same value for a property. Rather than writing your programs to examine characters one by one, it is much faster to process chunks of text that have the same property value.
Here are functions you can use to do this. They use eq for
comparing property values. In all cases, object defaults to the
current buffer.
For good performance, it’s very important to use the limit argument to these functions, especially the ones that search for a single property—otherwise, they may spend a long time scanning to the end of the buffer, if the property you are interested in does not change.
These functions do not move point; instead, they return a position (or
nil). Remember that a position is always between two characters;
the position returned by these functions is between two characters with
different properties.
The function scans the text forward from position pos in the string or buffer object until it finds a change in some text property, then returns the position of the change. In other words, it returns the position of the first character beyond pos whose properties are not identical to those of the character just after pos.
If limit is non-nil, then the scan ends at position
limit. If there is no property change before that point, this
function returns limit.
The value is nil if the properties remain unchanged all the way
to the end of object and limit is nil. If the value
is non-nil, it is a position greater than or equal to pos.
The value equals pos only when limit equals pos.
Here is an example of how to scan the buffer by chunks of text within which all properties are constant:
(while (not (eobp))
(let ((plist (text-properties-at (point)))
(next-change
(or (next-property-change (point) (current-buffer))
(point-max))))
Process text from point to next-change…
(goto-char next-change)))
This is like next-property-change, but scans back from pos
instead of forward. If the value is non-nil, it is a position
less than or equal to pos; it equals pos only if limit
equals pos.
The function scans text for a change in the prop property, then returns the position of the change. The scan goes forward from position pos in the string or buffer object. In other words, this function returns the position of the first character beyond pos whose prop property differs from that of the character just after pos.
If limit is non-nil, then the scan ends at position
limit. If there is no property change before that point,
next-single-property-change returns limit.
The value is nil if the property remains unchanged all the way to
the end of object and limit is nil. If the value is
non-nil, it is a position greater than or equal to pos; it
equals pos only if limit equals pos.
This is like next-single-property-change, but scans back from
pos instead of forward. If the value is non-nil, it is a
position less than or equal to pos; it equals pos only if
limit equals pos.
This is like next-property-change except that it considers
overlay properties as well as text properties, and if no change is
found before the end of the buffer, it returns the maximum buffer
position rather than nil (in this sense, it resembles the
corresponding overlay function next-overlay-change, rather than
next-property-change). There is no object operand
because this function operates only on the current buffer. It returns
the next address at which either kind of property changes.
This is like next-char-property-change, but scans back from
pos instead of forward, and returns the minimum buffer
position if no change is found.
This is like next-single-property-change except that it
considers overlay properties as well as text properties, and if no
change is found before the end of the object, it returns the
maximum valid position in object rather than nil. Unlike
next-char-property-change, this function does have an
object operand; if object is not a buffer, only
text-properties are considered.
This is like next-single-char-property-change, but scans back
from pos instead of forward, and returns the minimum valid
position in object if no change is found.
This function returns non-nil if at least one character between
start and end has a property prop whose value is
value. More precisely, it returns the position of the first such
character. Otherwise, it returns nil.
The optional fifth argument, object, specifies the string or buffer to scan. Positions are relative to object. The default for object is the current buffer.
This function returns non-nil if at least one character between
start and end does not have a property prop with value
value. More precisely, it returns the position of the first such
character. Otherwise, it returns nil.
The optional fifth argument, object, specifies the string or buffer to scan. Positions are relative to object. The default for object is the current buffer.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here is a table of text property names that have special built-in meanings. The following sections list a few additional special property names that control filling and property inheritance. All other names have no standard meaning, and you can use them as you like.
Note: the properties composition, display,
invisible and intangible can also cause point to move to
an acceptable place, after each Emacs command. See section Adjusting Point After Commands.
categoryIf a character has a category property, we call it the
property category of the character. It should be a symbol. The
properties of this symbol serve as defaults for the properties of the
character.
faceThe face property controls the appearance of the character
(see section Faces). The value of the property can be the following:
(keyword
value …), where each keyword is a face attribute
name and value is a value for that attribute.
(foreground-color . color-name)
or (background-color . color-name). This specifies the
foreground or background color, similar to (:foreground
color-name) or (:background color-name). This
form is supported for backward compatibility only, and should be
avoided.
Font Lock mode (see section Font Lock Mode) works in most buffers by
dynamically updating the face property of characters based on
the context.
The add-face-text-property function provides a convenient way
to set this text property. See section Changing Text Properties.
font-lock-faceThis property specifies a value for the face property that Font
Lock mode should apply to the underlying text. It is one of the
fontification methods used by Font Lock mode, and is useful for
special modes that implement their own highlighting.
See section Precalculated Fontification. When Font Lock mode is disabled,
font-lock-face has no effect.
mouse-faceThis property is used instead of face when the mouse is on or
near the character. For this purpose, “near” means that all text
between the character and where the mouse is have the same
mouse-face property value.
Emacs ignores all face attributes from the mouse-face property
that alter the text size (e.g., :height, :weight, and
:slant). Those attributes are always the same as for the
unhighlighted text.
fontifiedThis property says whether the text is ready for display. If
nil, Emacs’s redisplay routine calls the functions in
fontification-functions (see section Automatic Face Assignment) to prepare this
part of the buffer before it is displayed. It is used internally by
the “just in time” font locking code.
displayThis property activates various features that change the
way text is displayed. For example, it can make text appear taller
or shorter, higher or lower, wider or narrow, or replaced with an image.
See section The display Property.
help-echoIf text has a string as its help-echo property, then when you
move the mouse onto that text, Emacs displays that string in the echo
area, or in the tooltip window (see Tooltips in The GNU Emacs
Manual).
If the value of the help-echo property is a function, that
function is called with three arguments, window, object and
pos and should return a help string or nil for
none. The first argument, window is the window in which
the help was found. The second, object, is the buffer, overlay or
string which had the help-echo property. The pos
argument is as follows:
help-echo
property, and pos is the position in the overlay’s buffer.
display property), pos is the position in that
string.
If the value of the help-echo property is neither a function nor
a string, it is evaluated to obtain a help string.
You can alter the way help text is displayed by setting the variable
show-help-function (see Help display).
This feature is used in the mode line and for other active text.
keymapThe keymap property specifies an additional keymap for
commands. When this keymap applies, it is used for key lookup before
the minor mode keymaps and before the buffer’s local map.
See section Active Keymaps. If the property value is a symbol, the
symbol’s function definition is used as the keymap.
The property’s value for the character before point applies if it is
non-nil and rear-sticky, and the property’s value for the
character after point applies if it is non-nil and
front-sticky. (For mouse clicks, the position of the click is used
instead of the position of point.)
local-mapThis property works like keymap except that it specifies a
keymap to use instead of the buffer’s local map. For most
purposes (perhaps all purposes), it is better to use the keymap
property.
syntax-tableThe syntax-table property overrides what the syntax table says
about this particular character. See section Syntax Properties.
read-onlyIf a character has the property read-only, then modifying that
character is not allowed. Any command that would do so gets an error,
text-read-only. If the property value is a string, that string
is used as the error message.
Insertion next to a read-only character is an error if inserting
ordinary text there would inherit the read-only property due to
stickiness. Thus, you can control permission to insert next to
read-only text by controlling the stickiness. See section Stickiness of Text Properties.
Since changing properties counts as modifying the buffer, it is not
possible to remove a read-only property unless you know the
special trick: bind inhibit-read-only to a non-nil value
and then remove the property. See section Read-Only Buffers.
invisibleA non-nil invisible property can make a character invisible
on the screen. See section Invisible Text, for details.
intangibleIf a group of consecutive characters have equal and non-nil
intangible properties, then you cannot place point between them.
If you try to move point forward into the group, point actually moves to
the end of the group. If you try to move point backward into the group,
point actually moves to the start of the group.
If consecutive characters have unequal non-nil
intangible properties, they belong to separate groups; each
group is separately treated as described above.
When the variable inhibit-point-motion-hooks is non-nil,
the intangible property is ignored.
Beware: this property operates at a very low level, and affects a lot of code in unexpected ways. So use it with extreme caution. A common misuse is to put an intangible property on invisible text, which is actually unnecessary since the command loop will move point outside of the invisible text at the end of each command anyway. See section Adjusting Point After Commands.
fieldConsecutive characters with the same field property constitute a
field. Some motion functions including forward-word and
beginning-of-line stop moving at a field boundary.
See section Defining and Using Fields.
cursorNormally, the cursor is displayed at the beginning or the end of any
overlay and text property strings present at the current buffer
position. You can place the cursor on any desired character of these
strings by giving that character a non-nil cursor text
property. In addition, if the value of the cursor property is
an integer, it specifies the number of buffer’s character
positions, starting with the position where the overlay or the
display property begins, for which the cursor should be
displayed on that character. Specifically, if the value of the
cursor property of a character is the number n, the
cursor will be displayed on this character for any buffer position in
the range [ovpos..ovpos+n), where ovpos
is the overlay’s starting position given by overlay-start
(see section Managing Overlays), or the position where the display
text property begins in the buffer.
In other words, the string character with the cursor property
of any non-nil value is the character where to display the
cursor. The value of the property says for which buffer positions to
display the cursor there. If the value is an integer n,
the cursor is displayed there when point is anywhere between the
beginning of the overlay or display property and n
positions after that. If the value is anything else and
non-nil, the cursor is displayed there only when point is at
the beginning of the display property or at
overlay-start.
When the buffer has many overlay strings (e.g., see section before-string) or display properties that are
strings, it is a good idea to use the cursor property on these
strings to cue the Emacs display about the places where to put the
cursor while traversing these strings. This directly communicates to
the display engine where the Lisp program wants to put the cursor, or
where the user would expect the cursor.
pointerThis specifies a specific pointer shape when the mouse pointer is over this text or image. See section Pointer Shape, for possible pointer shapes.
line-spacingA newline can have a line-spacing text or overlay property that
controls the height of the display line ending with that newline. The
property value overrides the default frame line spacing and the buffer
local line-spacing variable. See section Line Height.
line-heightA newline can have a line-height text or overlay property that
controls the total height of the display line ending in that newline.
See section Line Height.
wrap-prefixIf text has a wrap-prefix property, the prefix it defines will
be added at display time to the beginning of every continuation line
due to text wrapping (so if lines are truncated, the wrap-prefix is
never used). It may be a string or an image (see section Other Display Specifications), or a stretch of whitespace such as specified by the
:width or :align-to display properties (see section Specified Spaces).
A wrap-prefix may also be specified for an entire buffer using the
wrap-prefix buffer-local variable (however, a
wrap-prefix text-property takes precedence over the value of
the wrap-prefix variable). See section Truncation.
line-prefixIf text has a line-prefix property, the prefix it defines will
be added at display time to the beginning of every non-continuation
line. It may be a string or an image (see section Other Display Specifications), or a stretch of whitespace such as specified by the
:width or :align-to display properties (see section Specified Spaces).
A line-prefix may also be specified for an entire buffer using the
line-prefix buffer-local variable (however, a
line-prefix text-property takes precedence over the value of
the line-prefix variable). See section Truncation.
modification-hooksIf a character has the property modification-hooks, then its
value should be a list of functions; modifying that character calls
all of those functions before the actual modification. Each function
receives two arguments: the beginning and end of the part of the
buffer being modified. Note that if a particular modification hook
function appears on several characters being modified by a single
primitive, you can’t predict how many times the function will
be called.
Furthermore, insertion will not modify any existing character, so this
hook will only be run when removing some characters, replacing them
with others, or changing their text-properties.
If these functions modify the buffer, they should bind
inhibit-modification-hooks to t around doing so, to
avoid confusing the internal mechanism that calls these hooks.
Overlays also support the modification-hooks property, but the
details are somewhat different (see section Overlay Properties).
insert-in-front-hooksinsert-behind-hooksThe operation of inserting text in a buffer also calls the functions
listed in the insert-in-front-hooks property of the following
character and in the insert-behind-hooks property of the
preceding character. These functions receive two arguments, the
beginning and end of the inserted text. The functions are called
after the actual insertion takes place.
See also Change Hooks, for other hooks that are called when you change text in a buffer.
point-enteredpoint-leftThe special properties point-entered and point-left
record hook functions that report motion of point. Each time point
moves, Emacs compares these two property values:
point-left property of the character after the old location,
and
point-entered property of the character after the new
location.
If these two values differ, each of them is called (if not nil)
with two arguments: the old value of point, and the new one.
The same comparison is made for the characters before the old and new
locations. The result may be to execute two point-left functions
(which may be the same function) and/or two point-entered
functions (which may be the same function). In any case, all the
point-left functions are called first, followed by all the
point-entered functions.
It is possible to use char-after to examine characters at various
buffer positions without moving point to those positions. Only an
actual change in the value of point runs these hook functions.
The variable inhibit-point-motion-hooks can inhibit running the
point-left and point-entered hooks, see Inhibit point motion hooks.
compositionThis text property is used to display a sequence of characters as a
single glyph composed from components. But the value of the property
itself is completely internal to Emacs and should not be manipulated
directly by, for instance, put-text-property.
When this variable is
non-nil, point-left and point-entered hooks are
not run, and the intangible property has no effect. Do not set
this variable globally; bind it with let.
If this variable is non-nil, it specifies a
function called to display help strings. These may be help-echo
properties, menu help strings (see section Simple Menu Items,
see section Extended Menu Items), or tool bar help strings (see section Tool bars). The specified function is called with one argument, the help
string to display. Tooltip mode (see Tooltips in The GNU Emacs
Manual) provides an example.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These text properties affect the behavior of the fill commands. They are used for representing formatted text. See section Filling, and Margins for Filling.
hardIf a newline character has this property, it is a “hard” newline.
The fill commands do not alter hard newlines and do not move words
across them. However, this property takes effect only if the
use-hard-newlines minor mode is enabled. See Hard and Soft Newlines in The GNU Emacs Manual.
right-marginThis property specifies an extra right margin for filling this part of the text.
left-marginThis property specifies an extra left margin for filling this part of the text.
justificationThis property specifies the style of justification for filling this part of the text.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Self-inserting characters normally take on the same properties as the preceding character. This is called inheritance of properties.
A Lisp program can do insertion with inheritance or without,
depending on the choice of insertion primitive. The ordinary text
insertion functions, such as insert, do not inherit any
properties. They insert text with precisely the properties of the
string being inserted, and no others. This is correct for programs
that copy text from one context to another—for example, into or out
of the kill ring. To insert with inheritance, use the special
primitives described in this section. Self-inserting characters
inherit properties because they work using these primitives.
When you do insertion with inheritance, which properties are inherited, and from where, depends on which properties are sticky. Insertion after a character inherits those of its properties that are rear-sticky. Insertion before a character inherits those of its properties that are front-sticky. When both sides offer different sticky values for the same property, the previous character’s value takes precedence.
By default, a text property is rear-sticky but not front-sticky; thus, the default is to inherit all the properties of the preceding character, and nothing from the following character.
You can control the stickiness of various text properties with two
specific text properties, front-sticky and rear-nonsticky,
and with the variable text-property-default-nonsticky. You can
use the variable to specify a different default for a given property.
You can use those two text properties to make any specific properties
sticky or nonsticky in any particular part of the text.
If a character’s front-sticky property is t, then all
its properties are front-sticky. If the front-sticky property is
a list, then the sticky properties of the character are those whose
names are in the list. For example, if a character has a
front-sticky property whose value is (face read-only),
then insertion before the character can inherit its face property
and its read-only property, but no others.
The rear-nonsticky property works the opposite way. Most
properties are rear-sticky by default, so the rear-nonsticky
property says which properties are not rear-sticky. If a
character’s rear-nonsticky property is t, then none of its
properties are rear-sticky. If the rear-nonsticky property is a
list, properties are rear-sticky unless their names are in the
list.
This variable holds an alist which defines the default rear-stickiness
of various text properties. Each element has the form
(property . nonstickiness), and it defines the
stickiness of a particular text property, property.
If nonstickiness is non-nil, this means that the property
property is rear-nonsticky by default. Since all properties are
front-nonsticky by default, this makes property nonsticky in both
directions by default.
The text properties front-sticky and rear-nonsticky, when
used, take precedence over the default nonstickiness specified in
text-property-default-nonsticky.
Here are the functions that insert text with inheritance of properties:
Insert the strings strings, just like the function insert,
but inherit any sticky properties from the adjoining text.
Insert the strings strings, just like the function
insert-before-markers, but inherit any sticky properties from the
adjoining text.
See section Inserting Text, for the ordinary insertion functions which do not inherit.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Instead of computing text properties for all the text in the buffer, you can arrange to compute the text properties for parts of the text when and if something depends on them.
The primitive that extracts text from the buffer along with its
properties is buffer-substring. Before examining the properties,
this function runs the abnormal hook buffer-access-fontify-functions.
This variable holds a list of functions for computing text properties.
Before buffer-substring copies the text and text properties for a
portion of the buffer, it calls all the functions in this list. Each of
the functions receives two arguments that specify the range of the
buffer being accessed. (The buffer itself is always the current
buffer.)
The function buffer-substring-no-properties does not call these
functions, since it ignores text properties anyway.
In order to prevent the hook functions from being called more than
once for the same part of the buffer, you can use the variable
buffer-access-fontified-property.
If this variable’s value is non-nil, it is a symbol which is used
as a text property name. A non-nil value for that text property
means, “the other text properties for this character have already been
computed”.
If all the characters in the range specified for buffer-substring
have a non-nil value for this property, buffer-substring
does not call the buffer-access-fontify-functions functions. It
assumes these characters already have the right text properties, and
just copies the properties they already have.
The normal way to use this feature is that the
buffer-access-fontify-functions functions add this property, as
well as others, to the characters they operate on. That way, they avoid
being called over and over for the same text.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Clickable text is text that can be clicked, with either the mouse or via a keyboard command, to produce some result. Many major modes use clickable text to implement textual hyper-links, or links for short.
The easiest way to insert and manipulate links is to use the
button package. See section Buttons. In this section, we will
explain how to manually set up clickable text in a buffer, using text
properties. For simplicity, we will refer to the clickable text as a
link.
Implementing a link involves three separate steps: (1) indicating
clickability when the mouse moves over the link; (2) making RET
or Mouse-2 on that link do something; and (3) setting up a
follow-link condition so that the link obeys
mouse-1-click-follows-link.
To indicate clickability, add the mouse-face text property to
the text of the link; then Emacs will highlight the link when the
mouse moves over it. In addition, you should define a tooltip or echo
area message, using the help-echo text property. See section Properties with Special Meanings. For instance, here is how Dired indicates that file
names are clickable:
(if (dired-move-to-filename)
(add-text-properties
(point)
(save-excursion
(dired-move-to-end-of-filename)
(point))
'(mouse-face highlight
help-echo "mouse-2: visit this file in other window")))
To make the link clickable, bind RET and Mouse-2 to commands that perform the desired action. Each command should check to see whether it was called on a link, and act accordingly. For instance, Dired’s major mode keymap binds Mouse-2 to the following command:
(defun dired-mouse-find-file-other-window (event)
"In Dired, visit the file or directory name you click on."
(interactive "e")
(let ((window (posn-window (event-end event)))
(pos (posn-point (event-end event)))
file)
(if (not (windowp window))
(error "No file chosen"))
(with-current-buffer (window-buffer window)
(goto-char pos)
(setq file (dired-get-file-for-visit)))
(if (file-directory-p file)
(or (and (cdr dired-subdir-alist)
(dired-goto-subdir file))
(progn
(select-window window)
(dired-other-window file)))
(select-window window)
(find-file-other-window (file-name-sans-versions file t)))))
This command uses the functions posn-window and
posn-point to determine where the click occurred, and
dired-get-file-for-visit to determine which file to visit.
Instead of binding the mouse command in a major mode keymap, you can
bind it within the link text, using the keymap text property
(see section Properties with Special Meanings). For instance:
(let ((map (make-sparse-keymap))) (define-key map [mouse-2] 'operate-this-button) (put-text-property link-start link-end 'keymap map))
With this method, you can easily define different commands for different links. Furthermore, the global definition of RET and Mouse-2 remain available for the rest of the text in the buffer.
The basic Emacs command for clicking on links is Mouse-2.
However, for compatibility with other graphical applications, Emacs
also recognizes Mouse-1 clicks on links, provided the user
clicks on the link quickly without moving the mouse. This behavior is
controlled by the user option mouse-1-click-follows-link.
See Mouse References in The GNU Emacs Manual.
To set up the link so that it obeys
mouse-1-click-follows-link, you must either (1) apply a
follow-link text or overlay property to the link text, or (2)
bind the follow-link event to a keymap (which can be a major
mode keymap or a local keymap specified via the keymap text
property). The value of the follow-link property, or the
binding for the follow-link event, acts as a “condition” for
the link action. This condition tells Emacs two things: the
circumstances under which a Mouse-1 click should be regarded as
occurring “inside” the link, and how to compute an “action code”
that says what to translate the Mouse-1 click into. The link
action condition can be one of the following:
mouse-faceIf the condition is the symbol mouse-face, a position is inside
a link if there is a non-nil mouse-face property at that
position. The action code is always t.
For example, here is how Info mode handles Mouse-1:
(define-key Info-mode-map [follow-link] 'mouse-face)
If the condition is a function, func, then a position pos
is inside a link if (func pos) evaluates to
non-nil. The value returned by func serves as the action
code.
For example, here is how pcvs enables Mouse-1 to follow links on file names only:
(define-key map [follow-link]
(lambda (pos)
(eq (get-char-property pos 'face) 'cvs-filename-face)))
If the condition value is anything else, then the position is inside a link and the condition itself is the action code. Clearly, you should specify this kind of condition only when applying the condition via a text or property overlay on the link text (so that it does not apply to the entire buffer).
The action code tells Mouse-1 how to follow the link:
If the action code is a string or vector, the Mouse-1 event is
translated into the first element of the string or vector; i.e., the
action of the Mouse-1 click is the local or global binding of
that character or symbol. Thus, if the action code is "foo",
Mouse-1 translates into f. If it is [foo],
Mouse-1 translates into foo.
For any other non-nil action code, the Mouse-1 event is
translated into a Mouse-2 event at the same position.
To define Mouse-1 to activate a button defined with
define-button-type, give the button a follow-link
property. The property value should be a link action condition, as
described above. See section Buttons. For example, here is how Help mode
handles Mouse-1:
(define-button-type 'help-xref 'follow-link t 'action #'help-button-action)
To define Mouse-1 on a widget defined with
define-widget, give the widget a :follow-link property.
The property value should be a link action condition, as described
above. For example, here is how the link widget specifies that
a Mouse-1 click shall be translated to RET:
(define-widget 'link 'item "An embedded link." :button-prefix 'widget-link-prefix :button-suffix 'widget-link-suffix :follow-link "\C-m" :help-echo "Follow the link." :format "%[%t%]")
This function returns non-nil if position pos in the
current buffer is on a link. pos can also be a mouse event
location, as returned by event-start (see section Accessing Mouse Events).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A field is a range of consecutive characters in the buffer that are
identified by having the same value (comparing with eq) of the
field property (either a text-property or an overlay property).
This section describes special functions that are available for
operating on fields.
You specify a field with a buffer position, pos. We think of each field as containing a range of buffer positions, so the position you specify stands for the field containing that position.
When the characters before and after pos are part of the same
field, there is no doubt which field contains pos: the one those
characters both belong to. When pos is at a boundary between
fields, which field it belongs to depends on the stickiness of the
field properties of the two surrounding characters (see section Stickiness of Text Properties). The field whose property would be inherited by text
inserted at pos is the field that contains pos.
There is an anomalous case where newly inserted text at pos
would not inherit the field property from either side. This
happens if the previous character’s field property is not
rear-sticky, and the following character’s field property is not
front-sticky. In this case, pos belongs to neither the preceding
field nor the following field; the field functions treat it as belonging
to an empty field whose beginning and end are both at pos.
In all of these functions, if pos is omitted or nil, the
value of point is used by default. If narrowing is in effect, then
pos should fall within the accessible portion. See section Narrowing.
This function returns the beginning of the field specified by pos.
If pos is at the beginning of its field, and
escape-from-edge is non-nil, then the return value is
always the beginning of the preceding field that ends at pos,
regardless of the stickiness of the field properties around
pos.
If limit is non-nil, it is a buffer position; if the
beginning of the field is before limit, then limit will be
returned instead.
This function returns the end of the field specified by pos.
If pos is at the end of its field, and escape-from-edge is
non-nil, then the return value is always the end of the following
field that begins at pos, regardless of the stickiness of
the field properties around pos.
If limit is non-nil, it is a buffer position; if the end
of the field is after limit, then limit will be returned
instead.
This function returns the contents of the field specified by pos, as a string.
This function returns the contents of the field specified by pos, as a string, discarding text properties.
This function deletes the text of the field specified by pos.
This function “constrains” new-pos to the field that old-pos belongs to—in other words, it returns the position closest to new-pos that is in the same field as old-pos.
If new-pos is nil, then constrain-to-field uses
the value of point instead, and moves point to the resulting position
in addition to returning that position.
If old-pos is at the boundary of two fields, then the acceptable
final positions depend on the argument escape-from-edge. If
escape-from-edge is nil, then new-pos must be in
the field whose field property equals what new characters
inserted at old-pos would inherit. (This depends on the
stickiness of the field property for the characters before and
after old-pos.) If escape-from-edge is non-nil,
new-pos can be anywhere in the two adjacent fields.
Additionally, if two fields are separated by another field with the
special value boundary, then any point within this special
field is also considered to be “on the boundary”.
Commands like C-a with no argument, that normally move backward
to a specific kind of location and stay there once there, probably
should specify nil for escape-from-edge. Other motion
commands that check fields should probably pass t.
If the optional argument only-in-line is non-nil, and
constraining new-pos in the usual way would move it to a different
line, new-pos is returned unconstrained. This used in commands
that move by line, such as next-line and
beginning-of-line, so that they respect field boundaries only in
the case where they can still move to the right line.
If the optional argument inhibit-capture-property is
non-nil, and old-pos has a non-nil property of that
name, then any field boundaries are ignored.
You can cause constrain-to-field to ignore all field boundaries
(and so never constrain anything) by binding the variable
inhibit-field-text-motion to a non-nil value.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Some editors that support adding attributes to text in the buffer do so by letting the user specify “intervals” within the text, and adding the properties to the intervals. Those editors permit the user or the programmer to determine where individual intervals start and end. We deliberately provided a different sort of interface in Emacs Lisp to avoid certain paradoxical behavior associated with text modification.
If the actual subdivision into intervals is meaningful, that means you can distinguish between a buffer that is just one interval with a certain property, and a buffer containing the same text subdivided into two intervals, both of which have that property.
Suppose you take the buffer with just one interval and kill part of the text. The text remaining in the buffer is one interval, and the copy in the kill ring (and the undo list) becomes a separate interval. Then if you yank back the killed text, you get two intervals with the same properties. Thus, editing does not preserve the distinction between one interval and two.
Suppose we “fix” this problem by coalescing the two intervals when the text is inserted. That works fine if the buffer originally was a single interval. But suppose instead that we have two adjacent intervals with the same properties, and we kill the text of one interval and yank it back. The same interval-coalescence feature that rescues the other case causes trouble in this one: after yanking, we have just one interval. Once again, editing does not preserve the distinction between one interval and two.
Insertion of text at the border between intervals also raises questions that have no satisfactory answer.
However, it is easy to arrange for editing to behave consistently for questions of the form, “What are the properties of text at this buffer or string position?” So we have decided these are the only questions that make sense; we have not implemented asking questions about where intervals start or end.
In practice, you can usually use the text property search functions in place of explicit interval boundaries. You can think of them as finding the boundaries of intervals, assuming that intervals are always coalesced whenever possible. See section Text Property Search Functions.
Emacs also provides explicit intervals as a presentation feature; see Overlays.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The following functions replace characters within a specified region based on their character codes.
This function replaces all occurrences of the character old-char with the character new-char in the region of the current buffer defined by start and end.
If noundo is non-nil, then subst-char-in-region does
not record the change for undo and does not mark the buffer as modified.
This was useful for controlling the old selective display feature
(see section Selective Display).
subst-char-in-region does not move point and returns
nil.
---------- Buffer: foo ---------- This is the contents of the buffer before. ---------- Buffer: foo ----------
(subst-char-in-region 1 20 ?i ?X)
⇒ nil
---------- Buffer: foo ----------
ThXs Xs the contents of the buffer before.
---------- Buffer: foo ----------
This function applies a translation table to the characters in the buffer between positions start and end.
The translation table table is a string or a char-table;
(aref table ochar) gives the translated character
corresponding to ochar. If table is a string, any
characters with codes larger than the length of table are not
altered by the translation.
The return value of translate-region is the number of
characters that were actually changed by the translation. This does
not count characters that were mapped into themselves in the
translation table.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A register is a sort of variable used in Emacs editing that can hold a variety of different kinds of values. Each register is named by a single character. All ASCII characters and their meta variants (but with the exception of C-g) can be used to name registers. Thus, there are 255 possible registers. A register is designated in Emacs Lisp by the character that is its name.
This variable is an alist of elements of the form (name .
contents). Normally, there is one element for each Emacs
register that has been used.
The object name is a character (an integer) identifying the register.
The contents of a register can have several possible types:
A number stands for itself. If insert-register finds a number
in the register, it converts the number to decimal.
A marker represents a buffer position to jump to.
A string is text saved in the register.
A rectangle is represented by a list of strings.
(window-configuration position)This represents a window configuration to restore in one frame, and a position to jump to in the current buffer.
(frame-configuration position)This represents a frame configuration to restore, and a position to jump to in the current buffer.
This represents a file to visit; jumping to this value visits file filename.
This represents a file to visit and a position in it; jumping to this value visits file filename and goes to buffer position position. Restoring this type of position asks the user for confirmation first.
The functions in this section return unpredictable values unless otherwise stated.
This function returns the contents of the register
reg, or nil if it has no contents.
This function sets the contents of register reg to value. A register can be set to any value, but the other register functions expect only certain data types. The return value is value.
This command displays what is contained in register reg.
This command inserts contents of register reg into the current buffer.
Normally, this command puts point before the inserted text, and the
mark after it. However, if the optional second argument beforep
is non-nil, it puts the mark before and point after.
You can pass a non-nil second argument beforep to this
function interactively by supplying any prefix argument.
If the register contains a rectangle, then the rectangle is inserted with its upper left corner at point. This means that text is inserted in the current line and underneath it on successive lines.
If the register contains something other than saved text (a string) or a rectangle (a list), currently useless things happen. This may be changed in the future.
This function reads and returns a register name, prompting with
prompt and possibly showing a preview of the existing registers
and their contents. The preview is shown in a temporary window, after
the delay specified by the user option register-preview-delay,
if its value and register-alist are both non-nil. The
preview is also shown if the user requests help (e.g., by typing the
help character). We recommend that all interactive commands which
read register names use this function.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This function can be used to transpose stretches of text:
This function exchanges two nonoverlapping portions of the buffer. Arguments start1 and end1 specify the bounds of one portion and arguments start2 and end2 specify the bounds of the other portion.
Normally, transpose-regions relocates markers with the transposed
text; a marker previously positioned within one of the two transposed
portions moves along with that portion, thus remaining between the same
two characters in their new position. However, if leave-markers
is non-nil, transpose-regions does not do this—it leaves
all markers unrelocated.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When auto-compression-mode is enabled, Emacs automatically
uncompresses compressed files when you visit them, and automatically
recompresses them if you alter and save them. See Compressed
Files in The GNU Emacs Manual.
The above feature works by calling an external executable (e.g.,
gzip). Emacs can also be compiled with support for built-in
decompression using the zlib library, which is faster than calling an
external program.
This function returns non-nil if built-in zlib decompression is
available.
This function decompresses the region between start and
end, using built-in zlib decompression. The region should
contain data that were compressed with gzip or zlib. On success, the
function replaces the contents of the region with the decompressed
data. On failure, the function leaves the region unchanged and
returns nil. This function can be called only in unibyte
buffers.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Base 64 code is used in email to encode a sequence of 8-bit bytes as a longer sequence of ASCII graphic characters. It is defined in Internet RFC142045. This section describes the functions for converting to and from this code.
This function converts the region from beg to end into base
64 code. It returns the length of the encoded text. An error is
signaled if a character in the region is multibyte, i.e., in a
multibyte buffer the region must contain only characters from the
charsets ascii, eight-bit-control and
eight-bit-graphic.
Normally, this function inserts newline characters into the encoded
text, to avoid overlong lines. However, if the optional argument
no-line-break is non-nil, these newlines are not added, so
the output is just one long line.
This function converts the string string into base 64 code. It
returns a string containing the encoded text. As for
base64-encode-region, an error is signaled if a character in the
string is multibyte.
Normally, this function inserts newline characters into the encoded
text, to avoid overlong lines. However, if the optional argument
no-line-break is non-nil, these newlines are not added, so
the result string is just one long line.
This function converts the region from beg to end from base 64 code into the corresponding decoded text. It returns the length of the decoded text.
The decoding functions ignore newline characters in the encoded text.
This function converts the string string from base 64 code into the corresponding decoded text. It returns a unibyte string containing the decoded text.
The decoding functions ignore newline characters in the encoded text.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs has built-in support for computing cryptographic hashes. A cryptographic hash, or checksum, is a digital “fingerprint” of a piece of data (e.g., a block of text) which can be used to check that you have an unaltered copy of that data.
Emacs supports several common cryptographic hash algorithms: MD5, SHA-1, SHA-2, SHA-224, SHA-256, SHA-384 and SHA-512. MD5 is the oldest of these algorithms, and is commonly used in message digests to check the integrity of messages transmitted over a network. MD5 is not “collision resistant” (i.e., it is possible to deliberately design different pieces of data which have the same MD5 hash), so you should not used it for anything security-related. A similar theoretical weakness also exists in SHA-1. Therefore, for security-related applications you should use the other hash types, such as SHA-2.
This function returns a hash for object. The argument
algorithm is a symbol stating which hash to compute: one of
md5, sha1, sha224, sha256, sha384
or sha512. The argument object should be a buffer or a
string.
The optional arguments start and end are character
positions specifying the portion of object to compute the
message digest for. If they are nil or omitted, the hash is
computed for the whole of object.
If the argument binary is omitted or nil, the function
returns the text form of the hash, as an ordinary Lisp string.
If binary is non-nil, it returns the hash in binary
form, as a sequence of bytes stored in a unibyte string.
This function does not compute the hash directly from the internal representation of object’s text (see section Text Representations). Instead, it encodes the text using a coding system (see section Coding Systems), and computes the hash from that encoded text. If object is a buffer, the coding system used is the one which would be chosen by default for writing the text into a file. If object is a string, the user’s preferred coding system is used (see Recognize Coding in GNU Emacs Manual).
This function returns an MD5 hash. It is semi-obsolete, since for
most purposes it is equivalent to calling secure-hash with
md5 as the algorithm argument. The object,
start and end arguments have the same meanings as in
secure-hash.
If coding-system is non-nil, it specifies a coding system
to use to encode the text; if omitted or nil, the default
coding system is used, like in secure-hash.
Normally, md5 signals an error if the text can’t be encoded
using the specified or chosen coding system. However, if
noerror is non-nil, it silently uses raw-text
coding instead.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When Emacs is compiled with libxml2 support, the following functions are available to parse HTML or XML text into Lisp object trees.
This function parses the text between start and end as HTML, and returns a list representing the HTML parse tree. It attempts to handle “real world” HTML by robustly coping with syntax mistakes.
The optional argument base-url, if non-nil, should be a
string specifying the base URL for relative URLs occurring in links.
In the parse tree, each HTML node is represented by a list in which the first element is a symbol representing the node name, the second element is an alist of node attributes, and the remaining elements are the subnodes.
The following example demonstrates this. Given this (malformed) HTML document:
<html><head></head><body width=101><div class=thing>Foo<div>Yes
A call to libxml-parse-html-region returns this:
(html ()
(head ())
(body ((width . "101"))
(div ((class . "thing"))
"Foo"
(div ()
"Yes"))))
This function renders the parsed HTML in dom into the current
buffer. The argument dom should be a list as generated by
libxml-parse-html-region. This function is, e.g., used by
EWW in The Emacs Web Wowser Manual.
This function is the same as libxml-parse-html-region, except
that it parses the text as XML rather than HTML (so it is stricter
about syntax).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In database terminology, an atomic change is an indivisible change—it can succeed entirely or it can fail entirely, but it cannot partly succeed. A Lisp program can make a series of changes to one or several buffers as an atomic change group, meaning that either the entire series of changes will be installed in their buffers or, in case of an error, none of them will be.
To do this for one buffer, the one already current, simply write a
call to atomic-change-group around the code that makes the
changes, like this:
(atomic-change-group (insert foo) (delete-region x y))
If an error (or other nonlocal exit) occurs inside the body of
atomic-change-group, it unmakes all the changes in that buffer
that were during the execution of the body. This kind of change group
has no effect on any other buffers—any such changes remain.
If you need something more sophisticated, such as to make changes in
various buffers constitute one atomic group, you must directly call
lower-level functions that atomic-change-group uses.
This function sets up a change group for buffer buffer, which defaults to the current buffer. It returns a “handle” that represents the change group. You must use this handle to activate the change group and subsequently to finish it.
To use the change group, you must activate it. You must do this before making any changes in the text of buffer.
This function activates the change group that handle designates.
After you activate the change group, any changes you make in that buffer become part of it. Once you have made all the desired changes in the buffer, you must finish the change group. There are two ways to do this: you can either accept (and finalize) all the changes, or cancel them all.
This function accepts all the changes in the change group specified by handle, making them final.
This function cancels and undoes all the changes in the change group specified by handle.
Your code should use unwind-protect to make sure the group is
always finished. The call to activate-change-group should be
inside the unwind-protect, in case the user types C-g
just after it runs. (This is one reason why
prepare-change-group and activate-change-group are
separate functions, because normally you would call
prepare-change-group before the start of that
unwind-protect.) Once you finish the group, don’t use the
handle again—in particular, don’t try to finish the same group
twice.
To make a multibuffer change group, call prepare-change-group
once for each buffer you want to cover, then use nconc to
combine the returned values, like this:
(nconc (prepare-change-group buffer-1)
(prepare-change-group buffer-2))
You can then activate the multibuffer change group with a single call
to activate-change-group, and finish it with a single call to
accept-change-group or cancel-change-group.
Nested use of several change groups for the same buffer works as you would expect. Non-nested use of change groups for the same buffer will get Emacs confused, so don’t let it happen; the first change group you start for any given buffer should be the last one finished.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These hook variables let you arrange to take notice of all changes in all buffers (or in a particular buffer, if you make them buffer-local). See also Properties with Special Meanings, for how to detect changes to specific parts of the text.
The functions you use in these hooks should save and restore the match data if they do anything that uses regular expressions; otherwise, they will interfere in bizarre ways with the editing operations that call them.
This variable holds a list of functions to call before any buffer modification. Each function gets two arguments, the beginning and end of the region that is about to change, represented as integers. The buffer that is about to change is always the current buffer.
This variable holds a list of functions to call after any buffer modification. Each function receives three arguments: the beginning and end of the region just changed, and the length of the text that existed before the change. All three arguments are integers. The buffer that has been changed is always the current buffer.
The length of the old text is the difference between the buffer positions before and after that text as it was before the change. As for the changed text, its length is simply the difference between the first two arguments.
Output of messages into the *Messages* buffer does not call these functions.
The macro executes body normally, but arranges to call the after-change functions just once for a series of several changes—if that seems safe.
If a program makes several text changes in the same area of the buffer,
using the macro combine-after-change-calls around that part of
the program can make it run considerably faster when after-change hooks
are in use. When the after-change hooks are ultimately called, the
arguments specify a portion of the buffer including all of the changes
made within the combine-after-change-calls body.
Warning: You must not alter the values of
after-change-functions within
the body of a combine-after-change-calls form.
Warning: if the changes you combine occur in widely scattered parts of the buffer, this will still work, but it is not advisable, because it may lead to inefficient behavior for some change hook functions.
This variable is a normal hook that is run whenever a buffer is changed that was previously in the unmodified state.
If this variable is non-nil, all of the change hooks are
disabled; none of them run. This affects all the hook variables
described above in this section, as well as the hooks attached to
certain special text properties (see section Properties with Special Meanings) and overlay
properties (see section Overlay Properties).
Also, this variable is bound to non-nil while running those
same hook variables, so that by default modifying the buffer from
a modification hook does not cause other modification hooks to be run.
If you do want modification hooks to be run in a particular piece of
code that is itself run from a modification hook, then rebind locally
inhibit-modification-hooks to nil.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This chapter covers the special issues relating to characters and how they are stored in strings and buffers.
| 32.1 Text Representations | How Emacs represents text. | |
| 32.2 Disabling Multibyte Characters | Controlling whether to use multibyte characters. | |
| 32.3 Converting Text Representations | Converting unibyte to multibyte and vice versa. | |
| 32.4 Selecting a Representation | Treating a byte sequence as unibyte or multi. | |
| 32.5 Character Codes | How unibyte and multibyte relate to codes of individual characters. | |
| 32.6 Character Properties | Character attributes that define their behavior and handling. | |
| 32.7 Character Sets | The space of possible character codes is divided into various character sets. | |
| 32.8 Scanning for Character Sets | Which character sets are used in a buffer? | |
| 32.9 Translation of Characters | Translation tables are used for conversion. | |
| 32.10 Coding Systems | Coding systems are conversions for saving files. | |
| 32.11 Input Methods | Input methods allow users to enter various non-ASCII characters without special keyboards. | |
| 32.12 Locales | Interacting with the POSIX locale. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs buffers and strings support a large repertoire of characters from many different scripts, allowing users to type and display text in almost any known written language.
To support this multitude of characters and scripts, Emacs closely
follows the Unicode Standard. The Unicode Standard assigns a
unique number, called a codepoint, to each and every character.
The range of codepoints defined by Unicode, or the Unicode
codespace, is 0..#x10FFFF (in hexadecimal notation),
inclusive. Emacs extends this range with codepoints in the range
#x110000..#x3FFFFF, which it uses for representing characters
that are not unified with Unicode and raw 8-bit bytes that
cannot be interpreted as characters. Thus, a character codepoint in
Emacs is a 22-bit integer.
To conserve memory, Emacs does not hold fixed-length 22-bit numbers that are codepoints of text characters within buffers and strings. Rather, Emacs uses a variable-length internal representation of characters, that stores each character as a sequence of 1 to 5 8-bit bytes, depending on the magnitude of its codepoint15. For example, any ASCII character takes up only 1 byte, a Latin-1 character takes up 2 bytes, etc. We call this representation of text multibyte.
Outside Emacs, characters can be represented in many different encodings, such as ISO-8859-1, GB-2312, Big-5, etc. Emacs converts between these external encodings and its internal representation, as appropriate, when it reads text into a buffer or a string, or when it writes text to a disk file or passes it to some other process.
Occasionally, Emacs needs to hold and manipulate encoded text or binary non-text data in its buffers or strings. For example, when Emacs visits a file, it first reads the file’s text verbatim into a buffer, and only then converts it to the internal representation. Before the conversion, the buffer holds encoded text.
Encoded text is not really text, as far as Emacs is concerned, but
rather a sequence of raw 8-bit bytes. We call buffers and strings
that hold encoded text unibyte buffers and strings, because
Emacs treats them as a sequence of individual bytes. Usually, Emacs
displays unibyte buffers and strings as octal codes such as
\237. We recommend that you never use unibyte buffers and
strings except for manipulating encoded text or binary non-text data.
In a buffer, the buffer-local value of the variable
enable-multibyte-characters specifies the representation used.
The representation for a string is determined and recorded in the string
when the string is constructed.
This variable specifies the current buffer’s text representation.
If it is non-nil, the buffer contains multibyte text; otherwise,
it contains unibyte encoded text or binary non-text data.
You cannot set this variable directly; instead, use the function
set-buffer-multibyte to change a buffer’s representation.
Buffer positions are measured in character units. This function
returns the byte-position corresponding to buffer position
position in the current buffer. This is 1 at the start of the
buffer, and counts upward in bytes. If position is out of
range, the value is nil.
Return the buffer position, in character units, corresponding to given
byte-position in the current buffer. If byte-position is
out of range, the value is nil. In a multibyte buffer, an
arbitrary value of byte-position can be not at character
boundary, but inside a multibyte sequence representing a single
character; in this case, this function returns the buffer position of
the character whose multibyte sequence includes byte-position.
In other words, the value does not change for all byte positions that
belong to the same character.
Return t if string is a multibyte string, nil
otherwise. This function also returns nil if string is
some object other than a string.
This function returns the number of bytes in string.
If string is a multibyte string, this can be greater than
(length string).
This function concatenates all its argument bytes and makes the result a unibyte string.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
By default, Emacs starts in multibyte mode: it stores the contents of buffers and strings using an internal encoding that represents non-ASCII characters using multi-byte sequences. Multibyte mode allows you to use all the supported languages and scripts without limitations.
Under very special circumstances, you may want to disable multibyte character support, for a specific buffer. When multibyte characters are disabled in a buffer, we call that unibyte mode. In unibyte mode, each character in the buffer has a character code ranging from 0 through 255 (0377 octal); 0 through 127 (0177 octal) represent ASCII characters, and 128 (0200 octal) through 255 (0377 octal) represent non-ASCII characters.
To edit a particular file in unibyte representation, visit it using
find-file-literally. See section Functions for Visiting Files. You can
convert a multibyte buffer to unibyte by saving it to a file, killing
the buffer, and visiting the file again with
find-file-literally. Alternatively, you can use C-x
RET c (universal-coding-system-argument) and specify
‘raw-text’ as the coding system with which to visit or save a
file. See Specifying a Coding System for File Text in GNU Emacs Manual. Unlike find-file-literally, finding
a file as ‘raw-text’ doesn’t disable format conversion,
uncompression, or auto mode selection.
The buffer-local variable enable-multibyte-characters is
non-nil in multibyte buffers, and nil in unibyte ones.
The mode line also indicates whether a buffer is multibyte or not.
With a graphical display, in a multibyte buffer, the portion of the
mode line that indicates the character set has a tooltip that (amongst
other things) says that the buffer is multibyte. In a unibyte buffer,
the character set indicator is absent. Thus, in a unibyte buffer
(when using a graphical display) there is normally nothing before the
indication of the visited file’s end-of-line convention (colon,
backslash, etc.), unless you are using an input method.
You can turn off multibyte support in a specific buffer by invoking the
command toggle-enable-multibyte-characters in that buffer.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs can convert unibyte text to multibyte; it can also convert multibyte text to unibyte, provided that the multibyte text contains only ASCII and 8-bit raw bytes. In general, these conversions happen when inserting text into a buffer, or when putting text from several strings together in one string. You can also explicitly convert a string’s contents to either representation.
Emacs chooses the representation for a string based on the text from which it is constructed. The general rule is to convert unibyte text to multibyte text when combining it with other multibyte text, because the multibyte representation is more general and can hold whatever characters the unibyte text has.
When inserting text into a buffer, Emacs converts the text to the
buffer’s representation, as specified by
enable-multibyte-characters in that buffer. In particular, when
you insert multibyte text into a unibyte buffer, Emacs converts the text
to unibyte, even though this conversion cannot in general preserve all
the characters that might be in the multibyte text. The other natural
alternative, to convert the buffer contents to multibyte, is not
acceptable because the buffer’s representation is a choice made by the
user that cannot be overridden automatically.
Converting unibyte text to multibyte text leaves ASCII characters unchanged, and converts bytes with codes 128 through 255 to the multibyte representation of raw eight-bit bytes.
Converting multibyte text to unibyte converts all ASCII and eight-bit characters to their single-byte form, but loses information for non-ASCII characters by discarding all but the low 8 bits of each character’s codepoint. Converting unibyte text to multibyte and back to unibyte reproduces the original unibyte text.
The next two functions either return the argument string, or a newly created string with no text properties.
This function returns a multibyte string containing the same sequence
of characters as string. If string is a multibyte string,
it is returned unchanged. The function assumes that string
includes only ASCII characters and raw 8-bit bytes; the
latter are converted to their multibyte representation corresponding
to the codepoints #x3FFF80 through #x3FFFFF, inclusive
(see section codepoints).
This function returns a unibyte string containing the same sequence of characters as string. It signals an error if string contains a non-ASCII character. If string is a unibyte string, it is returned unchanged. Use this function for string arguments that contain only ASCII and eight-bit characters.
This function returns a unibyte string containing a single byte of character data, character. It signals an error if character is not an integer between 0 and 255.
This converts the multibyte character char to a unibyte character, and returns that character. If char is neither ASCII nor eight-bit, the function returns -1.
This convert the unibyte character char to a multibyte character, assuming char is either ASCII or raw 8-bit byte.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Sometimes it is useful to examine an existing buffer or string as multibyte when it was unibyte, or vice versa.
Set the representation type of the current buffer. If multibyte
is non-nil, the buffer becomes multibyte. If multibyte
is nil, the buffer becomes unibyte.
This function leaves the buffer contents unchanged when viewed as a sequence of bytes. As a consequence, it can change the contents viewed as characters; for instance, a sequence of three bytes which is treated as one character in multibyte representation will count as three characters in unibyte representation. Eight-bit characters representing raw bytes are an exception. They are represented by one byte in a unibyte buffer, but when the buffer is set to multibyte, they are converted to two-byte sequences, and vice versa.
This function sets enable-multibyte-characters to record which
representation is in use. It also adjusts various data in the buffer
(including overlays, text properties and markers) so that they cover the
same text as they did before.
This function signals an error if the buffer is narrowed, since the narrowing might have occurred in the middle of multibyte character sequences.
This function also signals an error if the buffer is an indirect buffer. An indirect buffer always inherits the representation of its base buffer.
If string is already a unibyte string, this function returns string itself. Otherwise, it returns a new string with the same bytes as string, but treating each byte as a separate character (so that the value may have more characters than string); as an exception, each eight-bit character representing a raw byte is converted into a single byte. The newly-created string contains no text properties.
If string is a multibyte string, this function returns string itself. Otherwise, it returns a new string with the same bytes as string, but treating each multibyte sequence as one character. This means that the value may have fewer characters than string has. If a byte sequence in string is invalid as a multibyte representation of a single character, each byte in the sequence is treated as a raw 8-bit byte. The newly-created string contains no text properties.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The unibyte and multibyte text representations use different
character codes. The valid character codes for unibyte representation
range from 0 to #xFF (255)—the values that can fit in one
byte. The valid character codes for multibyte representation range
from 0 to #x3FFFFF. In this code space, values 0 through
#x7F (127) are for ASCII characters, and values
#x80 (128) through #x3FFF7F (4194175) are for
non-ASCII characters.
Emacs character codes are a superset of the Unicode standard.
Values 0 through #x10FFFF (1114111) correspond to Unicode
characters of the same codepoint; values #x110000 (1114112)
through #x3FFF7F (4194175) represent characters that are not
unified with Unicode; and values #x3FFF80 (4194176) through
#x3FFFFF (4194303) represent eight-bit raw bytes.
This returns t if charcode is a valid character, and
nil otherwise.
(characterp 65)
⇒ t
(characterp 4194303)
⇒ t
(characterp 4194304)
⇒ nil
This function returns the largest value that a valid character codepoint can have.
(characterp (max-char))
⇒ t
(characterp (1+ (max-char)))
⇒ nil
This function returns the byte at character position pos in the current buffer. If the current buffer is unibyte, this is literally the byte at that position. If the buffer is multibyte, byte values of ASCII characters are the same as character codepoints, whereas eight-bit raw bytes are converted to their 8-bit codes. The function signals an error if the character at pos is non-ASCII.
The optional argument string means to get a byte value from that string instead of the current buffer.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A character property is a named attribute of a character that specifies how the character behaves and how it should be handled during text processing and display. Thus, character properties are an important part of specifying the character’s semantics.
On the whole, Emacs follows the Unicode Standard in its implementation of character properties. In particular, Emacs supports the Unicode Character Property Model, and the Emacs character property database is derived from the Unicode Character Database (UCD). See the Character Properties chapter of the Unicode Standard, for a detailed description of Unicode character properties and their meaning. This section assumes you are already familiar with that chapter of the Unicode Standard, and want to apply that knowledge to Emacs Lisp programs.
In Emacs, each property has a name, which is a symbol, and a set of
possible values, whose types depend on the property; if a character
does not have a certain property, the value is nil. As a
general rule, the names of character properties in Emacs are produced
from the corresponding Unicode properties by downcasing them and
replacing each ‘_’ character with a dash ‘-’. For example,
Canonical_Combining_Class becomes
canonical-combining-class. However, sometimes we shorten the
names to make their use easier.
Some codepoints are left unassigned by the UCD—they don’t correspond to any character. The Unicode Standard defines default values of properties for such codepoints; they are mentioned below for each property.
Here is the full list of value types for all the character properties that Emacs knows about:
nameCorresponds to the Name Unicode property. The value is a
string consisting of upper-case Latin letters A to Z, digits, spaces,
and hyphen ‘-’ characters. For unassigned codepoints, the value
is nil.
general-categoryCorresponds to the General_Category Unicode property. The
value is a symbol whose name is a 2-letter abbreviation of the
character’s classification. For unassigned codepoints, the value
is Cn.
canonical-combining-classCorresponds to the Canonical_Combining_Class Unicode property.
The value is an integer. For unassigned codepoints, the value
is zero.
bidi-classCorresponds to the Unicode Bidi_Class property. The value is a
symbol whose name is the Unicode directional type of the
character. Emacs uses this property when it reorders bidirectional
text for display (see section Bidirectional Display). For unassigned
codepoints, the value depends on the code blocks to which the
codepoint belongs: most unassigned codepoints get the value of
L (strong L), but some get values of AL (Arabic letter)
or R (strong R).
decompositionCorresponds to the Unicode properties Decomposition_Type and
Decomposition_Value. The value is a list, whose first element
may be a symbol representing a compatibility formatting tag, such as
small16; the other elements are characters that give the
compatibility decomposition sequence of this character. For
unassigned codepoints, the value is the character itself.
decimal-digit-valueCorresponds to the Unicode Numeric_Value property for
characters whose Numeric_Type is ‘Decimal’. The value is
an integer. For unassigned codepoints, the value is
nil, which means NaN, or “not-a-number”.
digit-valueCorresponds to the Unicode Numeric_Value property for
characters whose Numeric_Type is ‘Digit’. The value is an
integer. Examples of such characters include compatibility
subscript and superscript digits, for which the value is the
corresponding number. For unassigned codepoints, the value is
nil, which means NaN.
numeric-valueCorresponds to the Unicode Numeric_Value property for
characters whose Numeric_Type is ‘Numeric’. The value of
this property is a number. Examples of
characters that have this property include fractions, subscripts,
superscripts, Roman numerals, currency numerators, and encircled
numbers. For example, the value of this property for the character
U+2155 (VULGAR FRACTION ONE FIFTH) is 0.2. For
unassigned codepoints, the value is nil, which means
NaN.
mirroredCorresponds to the Unicode Bidi_Mirrored property. The value
of this property is a symbol, either Y or N. For
unassigned codepoints, the value is N.
mirroringCorresponds to the Unicode Bidi_Mirroring_Glyph property. The
value of this property is a character whose glyph represents the
mirror image of the character’s glyph, or nil if there’s no
defined mirroring glyph. All the characters whose mirrored
property is N have nil as their mirroring
property; however, some characters whose mirrored property is
Y also have nil for mirroring, because no
appropriate characters exist with mirrored glyphs. Emacs uses this
property to display mirror images of characters when appropriate
(see section Bidirectional Display). For unassigned codepoints, the value
is nil.
old-nameCorresponds to the Unicode Unicode_1_Name property. The value
is a string. Unassigned codepoints, and characters that have no value
for this property, the value is nil.
iso-10646-commentCorresponds to the Unicode ISO_Comment property. The value is
a string. For unassigned codepoints, the value is an empty string.
uppercaseCorresponds to the Unicode Simple_Uppercase_Mapping property.
The value of this property is a single character. For unassigned
codepoints, the value is nil, which means the character itself.
lowercaseCorresponds to the Unicode Simple_Lowercase_Mapping property.
The value of this property is a single character. For unassigned
codepoints, the value is nil, which means the character itself.
titlecaseCorresponds to the Unicode Simple_Titlecase_Mapping property.
Title case is a special form of a character used when the first
character of a word needs to be capitalized. The value of this
property is a single character. For unassigned codepoints, the value
is nil, which means the character itself.
This function returns the value of char’s propname property.
(get-char-code-property ?\s 'general-category)
⇒ Zs
(get-char-code-property ?1 'general-category)
⇒ Nd
;; subscript 4
(get-char-code-property ?\u2084 'digit-value)
⇒ 4
;; one fifth
(get-char-code-property ?\u2155 'numeric-value)
⇒ 0.2
;; Roman IV
(get-char-code-property ?\u2163 'numeric-value)
⇒ 4
This function returns the description string of property prop’s
value, or nil if value has no description.
(char-code-property-description 'general-category 'Zs)
⇒ "Separator, Space"
(char-code-property-description 'general-category 'Nd)
⇒ "Number, Decimal Digit"
(char-code-property-description 'numeric-value '1/5)
⇒ nil
This function stores value as the value of the property propname for the character char.
The value of this variable is a char-table (see section Char-Tables) that
specifies, for each character, its Unicode General_Category
property as a symbol.
The value of this variable is a char-table that specifies, for each character, a symbol whose name is the script to which the character belongs, according to the Unicode Standard classification of the Unicode code space into script-specific blocks. This char-table has a single extra slot whose value is the list of all script symbols.
The value of this variable is a char-table that specifies the width of each character in columns that it will occupy on the screen.
The value of this variable is a char-table that specifies, for each
character, whether it is printable or not. That is, if evaluating
(aref printable-chars char) results in t, the character
is printable, and if it results in nil, it is not.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
An Emacs character set, or charset, is a set of characters
in which each character is assigned a numeric code point. (The
Unicode Standard calls this a coded character set.) Each Emacs
charset has a name which is a symbol. A single character can belong
to any number of different character sets, but it will generally have
a different code point in each charset. Examples of character sets
include ascii, iso-8859-1, greek-iso8859-7, and
windows-1255. The code point assigned to a character in a
charset is usually different from its code point used in Emacs buffers
and strings.
Emacs defines several special character sets. The character set
unicode includes all the characters whose Emacs code points are
in the range 0..#x10FFFF. The character set emacs
includes all ASCII and non-ASCII characters.
Finally, the eight-bit charset includes the 8-bit raw bytes;
Emacs uses it to represent raw bytes encountered in text.
Returns t if object is a symbol that names a character set,
nil otherwise.
The value is a list of all defined character set names.
This function returns a list of all defined character sets ordered by
their priority. If highestp is non-nil, the function
returns a single character set of the highest priority.
This function makes charsets the highest priority character sets.
This function returns the name of the character set of highest
priority that character belongs to. ASCII characters
are an exception: for them, this function always returns ascii.
If restriction is non-nil, it should be a list of
charsets to search. Alternatively, it can be a coding system, in
which case the returned charset must be supported by that coding
system (see section Coding Systems).
This function returns the property list of the character set charset. Although charset is a symbol, this is not the same as the property list of that symbol. Charset properties include important information about the charset, such as its documentation string, short name, etc.
This function sets the propname property of charset to the given value.
This function returns the value of charsets property propname.
This command displays a list of characters in the character set charset.
Emacs can convert between its internal representation of a character and the character’s codepoint in a specific charset. The following two functions support these conversions.
This function decodes a character that is assigned a code-point
in charset, to the corresponding Emacs character, and returns
it. If charset doesn’t contain a character of that code point,
the value is nil. If code-point doesn’t fit in a Lisp
integer (see section most-positive-fixnum), it can be
specified as a cons cell (high . low), where
low are the lower 16 bits of the value and high are the
high 16 bits.
This function returns the code point assigned to the character
char in charset. If the result does not fit in a Lisp
integer, it is returned as a cons cell (high . low)
that fits the second argument of decode-char above. If
charset doesn’t have a codepoint for char, the value is
nil.
The following function comes in handy for applying a certain function to all or part of the characters in a charset:
Call function for characters in charset. function
is called with two arguments. The first one is a cons cell
(from . to), where from and to
indicate a range of characters contained in charset. The second
argument passed to function is arg.
By default, the range of codepoints passed to function includes
all the characters in charset, but optional arguments
from-code and to-code limit that to the range of
characters between these two codepoints of charset. If either
of them is nil, it defaults to the first or last codepoint of
charset, respectively.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Sometimes it is useful to find out which character set a particular character belongs to. One use for this is in determining which coding systems (see section Coding Systems) are capable of representing all of the text in question; another is to determine the font(s) for displaying that text.
This function returns the charset of highest priority containing the
character at position pos in the current buffer. If pos
is omitted or nil, it defaults to the current value of point.
If pos is out of range, the value is nil.
This function returns a list of the character sets of highest priority that contain characters in the current buffer between positions beg and end.
The optional argument translation specifies a translation table
to use for scanning the text (see section Translation of Characters). If
it is non-nil, then each character in the region is translated
through this table, and the value returned describes the translated
characters instead of the characters actually in the buffer.
This function returns a list of character sets of highest priority
that contain characters in string. It is just like
find-charset-region, except that it applies to the contents of
string instead of part of the current buffer.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A translation table is a char-table (see section Char-Tables) that specifies a mapping of characters into characters. These tables are used in encoding and decoding, and for other purposes. Some coding systems specify their own particular translation tables; there are also default translation tables which apply to all other coding systems.
A translation table has two extra slots. The first is either
nil or a translation table that performs the reverse
translation; the second is the maximum number of characters to look up
for translating sequences of characters (see the description of
make-translation-table-from-alist below).
This function returns a translation table based on the argument
translations. Each element of translations should be a
list of elements of the form (from . to); this says
to translate the character from into to.
The arguments and the forms in each argument are processed in order, and if a previous form already translates to to some other character, say to-alt, from is also translated to to-alt.
During decoding, the translation table’s translations are applied to
the characters that result from ordinary decoding. If a coding system
has the property :decode-translation-table, that specifies the
translation table to use, or a list of translation tables to apply in
sequence. (This is a property of the coding system, as returned by
coding-system-get, not a property of the symbol that is the
coding system’s name. See section Basic Concepts of
Coding Systems.) Finally, if
standard-translation-table-for-decode is non-nil, the
resulting characters are translated by that table.
During encoding, the translation table’s translations are applied to
the characters in the buffer, and the result of translation is
actually encoded. If a coding system has property
:encode-translation-table, that specifies the translation table
to use, or a list of translation tables to apply in sequence. In
addition, if the variable standard-translation-table-for-encode
is non-nil, it specifies the translation table to use for
translating the result.
This is the default translation table for decoding. If a coding
systems specifies its own translation tables, the table that is the
value of this variable, if non-nil, is applied after them.
This is the default translation table for encoding. If a coding
systems specifies its own translation tables, the table that is the
value of this variable, if non-nil, is applied after them.
Self-inserting characters are translated through this translation table before they are inserted. Search commands also translate their input through this table, so they can compare more reliably with what’s in the buffer.
This variable automatically becomes buffer-local when set.
This function returns a translation table made from vec that is
an array of 256 elements to map bytes (values 0 through #xFF) to
characters. Elements may be nil for untranslated bytes. The
returned table has a translation table for reverse mapping in the
first extra slot, and the value 1 in the second extra slot.
This function provides an easy way to make a private coding system
that maps each byte to a specific character. You can specify the
returned table and the reverse translation table using the properties
:decode-translation-table and :encode-translation-table
respectively in the props argument to
define-coding-system.
This function is similar to make-translation-table but returns
a complex translation table rather than a simple one-to-one mapping.
Each element of alist is of the form (from
. to), where from and to are either characters or
vectors specifying a sequence of characters. If from is a
character, that character is translated to to (i.e., to a
character or a character sequence). If from is a vector of
characters, that sequence is translated to to. The returned
table has a translation table for reverse mapping in the first extra
slot, and the maximum length of all the from character sequences
in the second extra slot.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When Emacs reads or writes a file, and when Emacs sends text to a subprocess or receives text from a subprocess, it normally performs character code conversion and end-of-line conversion as specified by a particular coding system.
How to define a coding system is an arcane matter, and is not documented here.
| 32.10.1 Basic Concepts of Coding Systems | Basic concepts. | |
| 32.10.2 Encoding and I/O | How file I/O functions handle coding systems. | |
| 32.10.3 Coding Systems in Lisp | Functions to operate on coding system names. | |
| 32.10.4 User-Chosen Coding Systems | Asking the user to choose a coding system. | |
| 32.10.5 Default Coding Systems | Controlling the default choices. | |
| 32.10.6 Specifying a Coding System for One Operation | Requesting a particular coding system for a single file operation. | |
| 32.10.7 Explicit Encoding and Decoding | Encoding or decoding text without doing I/O. | |
| 32.10.8 Terminal I/O Encoding | Use of encoding for terminal I/O. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Character code conversion involves conversion between the internal representation of characters used inside Emacs and some other encoding. Emacs supports many different encodings, in that it can convert to and from them. For example, it can convert text to or from encodings such as Latin 1, Latin 2, Latin 3, Latin 4, Latin 5, and several variants of ISO 2022. In some cases, Emacs supports several alternative encodings for the same characters; for example, there are three coding systems for the Cyrillic (Russian) alphabet: ISO, Alternativnyj, and KOI8.
Every coding system specifies a particular set of character code
conversions, but the coding system undecided is special: it
leaves the choice unspecified, to be chosen heuristically for each
file, based on the file’s data.
In general, a coding system doesn’t guarantee roundtrip identity: decoding a byte sequence using coding system, then encoding the resulting text in the same coding system, can produce a different byte sequence. But some coding systems do guarantee that the byte sequence will be the same as what you originally decoded. Here are a few examples:
iso-8859-1, utf-8, big5, shift_jis, euc-jp
Encoding buffer text and then decoding the result can also fail to reproduce the original text. For instance, if you encode a character with a coding system which does not support that character, the result is unpredictable, and thus decoding it using the same coding system may produce a different text. Currently, Emacs can’t report errors that result from encoding unsupported characters.
End of line conversion handles three different conventions used on various systems for representing end of line in files. The Unix convention, used on GNU and Unix systems, is to use the linefeed character (also called newline). The DOS convention, used on MS-Windows and MS-DOS systems, is to use a carriage-return and a linefeed at the end of a line. The Mac convention is to use just carriage-return. (This was the convention used on the Macintosh system prior to OS X.)
Base coding systems such as latin-1 leave the end-of-line
conversion unspecified, to be chosen based on the data. Variant
coding systems such as latin-1-unix, latin-1-dos and
latin-1-mac specify the end-of-line conversion explicitly as
well. Most base coding systems have three corresponding variants whose
names are formed by adding ‘-unix’, ‘-dos’ and ‘-mac’.
The coding system raw-text is special in that it prevents
character code conversion, and causes the buffer visited with this
coding system to be a unibyte buffer. For historical reasons, you can
save both unibyte and multibyte text with this coding system. When
you use raw-text to encode multibyte text, it does perform one
character code conversion: it converts eight-bit characters to their
single-byte external representation. raw-text does not specify
the end-of-line conversion, allowing that to be determined as usual by
the data, and has the usual three variants which specify the
end-of-line conversion.
no-conversion (and its alias binary) is equivalent to
raw-text-unix: it specifies no conversion of either character
codes or end-of-line.
The coding system utf-8-emacs specifies that the data is
represented in the internal Emacs encoding (see section Text Representations). This is like raw-text in that no code
conversion happens, but different in that the result is multibyte
data. The name emacs-internal is an alias for
utf-8-emacs.
This function returns the specified property of the coding system
coding-system. Most coding system properties exist for internal
purposes, but one that you might find useful is :mime-charset.
That property’s value is the name used in MIME for the character coding
which this coding system can read and write. Examples:
(coding-system-get 'iso-latin-1 :mime-charset)
⇒ iso-8859-1
(coding-system-get 'iso-2022-cn :mime-charset)
⇒ iso-2022-cn
(coding-system-get 'cyrillic-koi8 :mime-charset)
⇒ koi8-r
The value of the :mime-charset property is also defined
as an alias for the coding system.
This function returns the list of aliases of coding-system.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The principal purpose of coding systems is for use in reading and
writing files. The function insert-file-contents uses a coding
system to decode the file data, and write-region uses one to
encode the buffer contents.
You can specify the coding system to use either explicitly
(see section Specifying a Coding System for One Operation), or implicitly using a default
mechanism (see section Default Coding Systems). But these methods may not
completely specify what to do. For example, they may choose a coding
system such as undefined which leaves the character code
conversion to be determined from the data. In these cases, the I/O
operation finishes the job of choosing a coding system. Very often
you will want to find out afterwards which coding system was chosen.
This buffer-local variable records the coding system used for saving the
buffer and for writing part of the buffer with write-region. If
the text to be written cannot be safely encoded using the coding system
specified by this variable, these operations select an alternative
encoding by calling the function select-safe-coding-system
(see section User-Chosen Coding Systems). If selecting a different encoding
requires to ask the user to specify a coding system,
buffer-file-coding-system is updated to the newly selected coding
system.
buffer-file-coding-system does not affect sending text
to a subprocess.
This variable specifies the coding system for saving the buffer (by
overriding buffer-file-coding-system). Note that it is not used
for write-region.
When a command to save the buffer starts out to use
buffer-file-coding-system (or save-buffer-coding-system),
and that coding system cannot handle
the actual text in the buffer, the command asks the user to choose
another coding system (by calling select-safe-coding-system).
After that happens, the command also updates
buffer-file-coding-system to represent the coding system that
the user specified.
I/O operations for files and subprocesses set this variable to the coding system name that was used. The explicit encoding and decoding functions (see section Explicit Encoding and Decoding) set it too.
Warning: Since receiving subprocess output sets this variable, it can change whenever Emacs waits; therefore, you should copy the value shortly after the function call that stores the value you are interested in.
The variable selection-coding-system specifies how to encode
selections for the window system. See section Window System Selections.
The variable file-name-coding-system specifies the coding
system to use for encoding file names. Emacs encodes file names using
that coding system for all file operations. If
file-name-coding-system is nil, Emacs uses a default
coding system determined by the selected language environment. In the
default language environment, any non-ASCII characters in
file names are not encoded specially; they appear in the file system
using the internal Emacs representation.
Warning: if you change file-name-coding-system (or
the language environment) in the middle of an Emacs session, problems
can result if you have already visited files whose names were encoded
using the earlier coding system and are handled differently under the
new coding system. If you try to save one of these buffers under the
visited file name, saving may use the wrong file name, or it may get
an error. If such a problem happens, use C-x C-w to specify a
new file name for that buffer.
On Windows 2000 and later, Emacs by default uses Unicode APIs to
pass file names to the OS, so the value of
file-name-coding-system is largely ignored. Lisp applications
that need to encode or decode file names on the Lisp level should use
utf-8 coding-system when system-type is
windows-nt; the conversion of UTF-8 encoded file names to the
encoding appropriate for communicating with the OS is performed
internally by Emacs.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here are the Lisp facilities for working with coding systems:
This function returns a list of all coding system names (symbols). If
base-only is non-nil, the value includes only the
base coding systems. Otherwise, it includes alias and variant coding
systems as well.
This function returns t if object is a coding system
name or nil.
This function checks the validity of coding-system. If that is
valid, it returns coding-system. If coding-system is
nil, the function return nil. For any other values, it
signals an error whose error-symbol is coding-system-error
(see section signal).
This function returns the type of end-of-line (a.k.a. eol)
conversion used by coding-system. If coding-system
specifies a certain eol conversion, the return value is an integer 0,
1, or 2, standing for unix, dos, and mac,
respectively. If coding-system doesn’t specify eol conversion
explicitly, the return value is a vector of coding systems, each one
with one of the possible eol conversion types, like this:
(coding-system-eol-type 'latin-1)
⇒ [latin-1-unix latin-1-dos latin-1-mac]
If this function returns a vector, Emacs will decide, as part of the
text encoding or decoding process, what eol conversion to use. For
decoding, the end-of-line format of the text is auto-detected, and the
eol conversion is set to match it (e.g., DOS-style CRLF format will
imply dos eol conversion). For encoding, the eol conversion is
taken from the appropriate default coding system (e.g.,
default value of buffer-file-coding-system for
buffer-file-coding-system), or from the default eol conversion
appropriate for the underlying platform.
This function returns a coding system which is like coding-system
except for its eol conversion, which is specified by eol-type.
eol-type should be unix, dos, mac, or
nil. If it is nil, the returned coding system determines
the end-of-line conversion from the data.
eol-type may also be 0, 1 or 2, standing for unix,
dos and mac, respectively.
This function returns a coding system which uses the end-of-line
conversion of eol-coding, and the text conversion of
text-coding. If text-coding is nil, it returns
undecided, or one of its variants according to eol-coding.
This function returns a list of coding systems that could be used to encode a text between from and to. All coding systems in the list can safely encode any multibyte characters in that portion of the text.
If the text contains no multibyte characters, the function returns the
list (undecided).
This function returns a list of coding systems that could be used to
encode the text of string. All coding systems in the list can
safely encode any multibyte characters in string. If the text
contains no multibyte characters, this returns the list
(undecided).
This function returns a list of coding systems that could be used to encode all the character sets in the list charsets.
This function checks whether coding systems in the list
coding-system-list can encode all the characters in the region
between start and end. If all of the coding systems in
the list can encode the specified text, the function returns
nil. If some coding systems cannot encode some of the
characters, the value is an alist, each element of which has the form
(coding-system1 pos1 pos2 …), meaning
that coding-system1 cannot encode characters at buffer positions
pos1, pos2, ....
start may be a string, in which case end is ignored and the returned value references string indices instead of buffer positions.
This function chooses a plausible coding system for decoding the text from start to end. This text should be a byte sequence, i.e., unibyte text or multibyte text with only ASCII and eight-bit characters (see section Explicit Encoding and Decoding).
Normally this function returns a list of coding systems that could
handle decoding the text that was scanned. They are listed in order of
decreasing priority. But if highest is non-nil, then the
return value is just one coding system, the one that is highest in
priority.
If the region contains only ASCII characters except for such
ISO-2022 control characters ISO-2022 as ESC, the value is
undecided or (undecided), or a variant specifying
end-of-line conversion, if that can be deduced from the text.
If the region contains null bytes, the value is no-conversion,
even if the region contains text encoded in some coding system.
This function is like detect-coding-region except that it
operates on the contents of string instead of bytes in the buffer.
If this variable has a non-nil value, null bytes are ignored
when detecting the encoding of a region or a string. This allows to
correctly detect the encoding of text that contains null bytes, such
as Info files with Index nodes.
If this variable has a non-nil value, ISO-2022 escape sequences
are ignored when detecting the encoding of a region or a string. The
result is that no text is ever detected as encoded in some ISO-2022
encoding, and all escape sequences become visible in a buffer.
Warning: Use this variable with extreme caution,
because many files in the Emacs distribution use ISO-2022 encoding.
This function returns the list of character sets (see section Character Sets) supported by coding-system. Some coding systems that support too many character sets to list them all yield special values:
(emacs).
(unicode).
iso-2022.
emacs-mule.
See Process Information, in
particular the description of the functions
process-coding-system and set-process-coding-system, for
how to examine or set the coding systems used for I/O to a subprocess.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This function selects a coding system for encoding specified text, asking the user to choose if necessary. Normally the specified text is the text in the current buffer between from and to. If from is a string, the string specifies the text to encode, and to is ignored.
If the specified text includes raw bytes (see section Text Representations), select-safe-coding-system suggests
raw-text for its encoding.
If default-coding-system is non-nil, that is the first
coding system to try; if that can handle the text,
select-safe-coding-system returns that coding system. It can
also be a list of coding systems; then the function tries each of them
one by one. After trying all of them, it next tries the current
buffer’s value of buffer-file-coding-system (if it is not
undecided), then the default value of
buffer-file-coding-system and finally the user’s most
preferred coding system, which the user can set using the command
prefer-coding-system (see Recognizing
Coding Systems in The GNU Emacs Manual).
If one of those coding systems can safely encode all the specified
text, select-safe-coding-system chooses it and returns it.
Otherwise, it asks the user to choose from a list of coding systems
which can encode all the text, and returns the user’s choice.
default-coding-system can also be a list whose first element is
t and whose other elements are coding systems. Then, if no coding
system in the list can handle the text, select-safe-coding-system
queries the user immediately, without trying any of the three
alternatives described above.
The optional argument accept-default-p, if non-nil,
should be a function to determine whether a coding system selected
without user interaction is acceptable. select-safe-coding-system
calls this function with one argument, the base coding system of the
selected coding system. If accept-default-p returns nil,
select-safe-coding-system rejects the silently selected coding
system, and asks the user to select a coding system from a list of
possible candidates.
If the variable select-safe-coding-system-accept-default-p is
non-nil, it should be a function taking a single argument.
It is used in place of accept-default-p, overriding any
value supplied for this argument.
As a final step, before returning the chosen coding system,
select-safe-coding-system checks whether that coding system is
consistent with what would be selected if the contents of the region
were read from a file. (If not, this could lead to data corruption in
a file subsequently re-visited and edited.) Normally,
select-safe-coding-system uses buffer-file-name as the
file for this purpose, but if file is non-nil, it uses
that file instead (this can be relevant for write-region and
similar functions). If it detects an apparent inconsistency,
select-safe-coding-system queries the user before selecting the
coding system.
Here are two functions you can use to let the user specify a coding system, with completion. See section Completion.
This function reads a coding system using the minibuffer, prompting with string prompt, and returns the coding system name as a symbol. If the user enters null input, default specifies which coding system to return. It should be a symbol or a string.
This function reads a coding system using the minibuffer, prompting with string prompt, and returns the coding system name as a symbol. If the user tries to enter null input, it asks the user to try again. See section Coding Systems.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes variables that specify the default coding system for certain files or when running certain subprograms, and the function that I/O operations use to access them.
The idea of these variables is that you set them once and for all to the
defaults you want, and then do not change them again. To specify a
particular coding system for a particular operation in a Lisp program,
don’t change these variables; instead, override them using
coding-system-for-read and coding-system-for-write
(see section Specifying a Coding System for One Operation).
This variable is an alist of text patterns and corresponding coding
systems. Each element has the form (regexp
. coding-system); a file whose first few kilobytes match
regexp is decoded with coding-system when its contents are
read into a buffer. The settings in this alist take priority over
coding: tags in the files and the contents of
file-coding-system-alist (see below). The default value is set
so that Emacs automatically recognizes mail files in Babyl format and
reads them with no code conversions.
This variable is an alist that specifies the coding systems to use for
reading and writing particular files. Each element has the form
(pattern . coding), where pattern is a regular
expression that matches certain file names. The element applies to file
names that match pattern.
The CDR of the element, coding, should be either a coding system, a cons cell containing two coding systems, or a function name (a symbol with a function definition). If coding is a coding system, that coding system is used for both reading the file and writing it. If coding is a cons cell containing two coding systems, its CAR specifies the coding system for decoding, and its CDR specifies the coding system for encoding.
If coding is a function name, the function should take one
argument, a list of all arguments passed to
find-operation-coding-system. It must return a coding system
or a cons cell containing two coding systems. This value has the same
meaning as described above.
If coding (or what returned by the above function) is
undecided, the normal code-detection is performed.
This variable is an alist that specifies the coding systems to use for
reading and writing particular files. Its form is like that of
file-coding-system-alist, but, unlike the latter, this variable
takes priority over any coding: tags in the file.
This variable is an alist specifying which coding systems to use for a
subprocess, depending on which program is running in the subprocess. It
works like file-coding-system-alist, except that pattern is
matched against the program name used to start the subprocess. The coding
system or systems specified in this alist are used to initialize the
coding systems used for I/O to the subprocess, but you can specify
other coding systems later using set-process-coding-system.
Warning: Coding systems such as undecided, which
determine the coding system from the data, do not work entirely reliably
with asynchronous subprocess output. This is because Emacs handles
asynchronous subprocess output in batches, as it arrives. If the coding
system leaves the character code conversion unspecified, or leaves the
end-of-line conversion unspecified, Emacs must try to detect the proper
conversion from one batch at a time, and this does not always work.
Therefore, with an asynchronous subprocess, if at all possible, use a
coding system which determines both the character code conversion and
the end of line conversion—that is, one like latin-1-unix,
rather than undecided or latin-1.
This variable is an alist that specifies the coding system to use for
network streams. It works much like file-coding-system-alist,
with the difference that the pattern in an element may be either a
port number or a regular expression. If it is a regular expression, it
is matched against the network service name used to open the network
stream.
This variable specifies the coding systems to use for subprocess (and network stream) input and output, when nothing else specifies what to do.
The value should be a cons cell of the form (input-coding
. output-coding). Here input-coding applies to input from
the subprocess, and output-coding applies to output to it.
This variable holds a list of functions that try to determine a coding system for a file based on its undecoded contents.
Each function in this list should be written to look at text in the
current buffer, but should not modify it in any way. The buffer will
contain undecoded text of parts of the file. Each function should
take one argument, size, which tells it how many characters to
look at, starting from point. If the function succeeds in determining
a coding system for the file, it should return that coding system.
Otherwise, it should return nil.
If a file has a ‘coding:’ tag, that takes precedence, so these functions won’t be called.
This function tries to determine a suitable coding system for
filename. It examines the buffer visiting the named file, using
the variables documented above in sequence, until it finds a match for
one of the rules specified by these variables. It then returns a cons
cell of the form (coding . source), where
coding is the coding system to use and source is a symbol,
one of auto-coding-alist, auto-coding-regexp-alist,
:coding, or auto-coding-functions, indicating which one
supplied the matching rule. The value :coding means the coding
system was specified by the coding: tag in the file
(see coding tag in The GNU Emacs Manual).
The order of looking for a matching rule is auto-coding-alist
first, then auto-coding-regexp-alist, then the coding:
tag, and lastly auto-coding-functions. If no matching rule was
found, the function returns nil.
The second argument size is the size of text, in characters,
following point. The function examines text only within size
characters after point. Normally, the buffer should be positioned at
the beginning when this function is called, because one of the places
for the coding: tag is the first one or two lines of the file;
in that case, size should be the size of the buffer.
This function returns a suitable coding system for file
filename. It uses find-auto-coding to find the coding
system. If no coding system could be determined, the function returns
nil. The meaning of the argument size is like in
find-auto-coding.
This function returns the coding system to use (by default) for performing operation with arguments. The value has this form:
(decoding-system . encoding-system)
The first element, decoding-system, is the coding system to use for decoding (in case operation does decoding), and encoding-system is the coding system for encoding (in case operation does encoding).
The argument operation is a symbol; it should be one of
write-region, start-process, call-process,
call-process-region, insert-file-contents, or
open-network-stream. These are the names of the Emacs I/O
primitives that can do character code and eol conversion.
The remaining arguments should be the same arguments that might be given
to the corresponding I/O primitive. Depending on the primitive, one
of those arguments is selected as the target. For example, if
operation does file I/O, whichever argument specifies the file
name is the target. For subprocess primitives, the process name is the
target. For open-network-stream, the target is the service name
or port number.
Depending on operation, this function looks up the target in
file-coding-system-alist, process-coding-system-alist,
or network-coding-system-alist. If the target is found in the
alist, find-operation-coding-system returns its association in
the alist; otherwise it returns nil.
If operation is insert-file-contents, the argument
corresponding to the target may be a cons cell of the form
(filename . buffer). In that case, filename
is a file name to look up in file-coding-system-alist, and
buffer is a buffer that contains the file’s contents (not yet
decoded). If file-coding-system-alist specifies a function to
call for this file, and that function needs to examine the file’s
contents (as it usually does), it should examine the contents of
buffer instead of reading the file.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can specify the coding system for a specific operation by binding
the variables coding-system-for-read and/or
coding-system-for-write.
If this variable is non-nil, it specifies the coding system to
use for reading a file, or for input from a synchronous subprocess.
It also applies to any asynchronous subprocess or network stream, but in
a different way: the value of coding-system-for-read when you
start the subprocess or open the network stream specifies the input
decoding method for that subprocess or network stream. It remains in
use for that subprocess or network stream unless and until overridden.
The right way to use this variable is to bind it with let for a
specific I/O operation. Its global value is normally nil, and
you should not globally set it to any other value. Here is an example
of the right way to use the variable:
;; Read the file with no character code conversion.
(let ((coding-system-for-read 'no-conversion))
(insert-file-contents filename))
When its value is non-nil, this variable takes precedence over
all other methods of specifying a coding system to use for input,
including file-coding-system-alist,
process-coding-system-alist and
network-coding-system-alist.
This works much like coding-system-for-read, except that it
applies to output rather than input. It affects writing to files,
as well as sending output to subprocesses and net connections.
When a single operation does both input and output, as do
call-process-region and start-process, both
coding-system-for-read and coding-system-for-write
affect it.
When this variable is non-nil, no end-of-line conversion is done,
no matter which coding system is specified. This applies to all the
Emacs I/O and subprocess primitives, and to the explicit encoding and
decoding functions (see section Explicit Encoding and Decoding).
Sometimes, you need to prefer several coding systems for some
operation, rather than fix a single one. Emacs lets you specify a
priority order for using coding systems. This ordering affects the
sorting of lists of coding systems returned by functions such as
find-coding-systems-region (see section Coding Systems in Lisp).
This function returns the list of coding systems in the order of their
current priorities. Optional argument highestp, if
non-nil, means return only the highest priority coding system.
This function puts coding-systems at the beginning of the priority list for coding systems, thus making their priority higher than all the rest.
This macro execute body, like progn does
(see section progn), with coding-systems at the front of
the priority list for coding systems. coding-systems should be
a list of coding systems to prefer during execution of body.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
All the operations that transfer text in and out of Emacs have the ability to use a coding system to encode or decode the text. You can also explicitly encode and decode text using the functions in this section.
The result of encoding, and the input to decoding, are not ordinary text. They logically consist of a series of byte values; that is, a series of ASCII and eight-bit characters. In unibyte buffers and strings, these characters have codes in the range 0 through #xFF (255). In a multibyte buffer or string, eight-bit characters have character codes higher than #xFF (see section Text Representations), but Emacs transparently converts them to their single-byte values when you encode or decode such text.
The usual way to read a file into a buffer as a sequence of bytes, so
you can decode the contents explicitly, is with
insert-file-contents-literally (see section Reading from Files);
alternatively, specify a non-nil rawfile argument when
visiting a file with find-file-noselect. These methods result in
a unibyte buffer.
The usual way to use the byte sequence that results from explicitly
encoding text is to copy it to a file or process—for example, to write
it with write-region (see section Writing to Files), and suppress
encoding by binding coding-system-for-write to
no-conversion.
Here are the functions to perform explicit encoding or decoding. The
encoding functions produce sequences of bytes; the decoding functions
are meant to operate on sequences of bytes. All of these functions
discard text properties. They also set last-coding-system-used
to the precise coding system they used.
This command encodes the text from start to end according
to coding system coding-system. Normally, the encoded text
replaces the original text in the buffer, but the optional argument
destination can change that. If destination is a buffer,
the encoded text is inserted in that buffer after point (point does
not move); if it is t, the command returns the encoded text as
a unibyte string without inserting it.
If encoded text is inserted in some buffer, this command returns the length of the encoded text.
The result of encoding is logically a sequence of bytes, but the buffer remains multibyte if it was multibyte before, and any 8-bit bytes are converted to their multibyte representation (see section Text Representations).
Do not use undecided for coding-system when
encoding text, since that may lead to unexpected results. Instead,
use select-safe-coding-system (see section select-safe-coding-system) to suggest a suitable encoding,
if there’s no obvious pertinent value for coding-system.
This function encodes the text in string according to coding
system coding-system. It returns a new string containing the
encoded text, except when nocopy is non-nil, in which
case the function may return string itself if the encoding
operation is trivial. The result of encoding is a unibyte string.
This command decodes the text from start to end according
to coding system coding-system. To make explicit decoding
useful, the text before decoding ought to be a sequence of byte
values, but both multibyte and unibyte buffers are acceptable (in the
multibyte case, the raw byte values should be represented as eight-bit
characters). Normally, the decoded text replaces the original text in
the buffer, but the optional argument destination can change
that. If destination is a buffer, the decoded text is inserted
in that buffer after point (point does not move); if it is t,
the command returns the decoded text as a multibyte string without
inserting it.
If decoded text is inserted in some buffer, this command returns the length of the decoded text.
This command puts a charset text property on the decoded text.
The value of the property states the character set used to decode the
original text.
This function decodes the text in string according to
coding-system. It returns a new string containing the decoded
text, except when nocopy is non-nil, in which case the
function may return string itself if the decoding operation is
trivial. To make explicit decoding useful, the contents of
string ought to be a unibyte string with a sequence of byte
values, but a multibyte string is also acceptable (assuming it
contains 8-bit bytes in their multibyte form).
If optional argument buffer specifies a buffer, the decoded text is inserted in that buffer after point (point does not move). In this case, the return value is the length of the decoded text.
This function puts a charset text property on the decoded text.
The value of the property states the character set used to decode the
original text:
(decode-coding-string "Gr\374ss Gott" 'latin-1)
⇒ #("Grüss Gott" 0 9 (charset iso-8859-1))
This function decodes the text from from to to as if
it were being read from file filename using insert-file-contents
using the rest of the arguments provided.
The normal way to use this function is after reading text from a file without decoding, if you decide you would rather have decoded it. Instead of deleting the text and reading it again, this time with decoding, you can call this function.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs can use coding systems to decode keyboard input and encode
terminal output. This is useful for terminals that transmit or
display text using a particular encoding, such as Latin-1. Emacs does
not set last-coding-system-used when encoding or decoding
terminal I/O.
This function returns the coding system used for decoding keyboard
input from terminal. A value of no-conversion means no
decoding is done. If terminal is omitted or nil, it
means the selected frame’s terminal. See section Multiple Terminals.
This command specifies coding-system as the coding system to use
for decoding keyboard input from terminal. If
coding-system is nil, that means not to decode keyboard
input. If terminal is a frame, it means that frame’s terminal;
if it is nil, that means the currently selected frame’s
terminal. See section Multiple Terminals.
This function returns the coding system that is in use for encoding
terminal output from terminal. A value of no-conversion
means no encoding is done. If terminal is a frame, it means
that frame’s terminal; if it is nil, that means the currently
selected frame’s terminal.
This command specifies coding-system as the coding system to use
for encoding terminal output from terminal. If
coding-system is nil, that means not to encode terminal
output. If terminal is a frame, it means that frame’s terminal;
if it is nil, that means the currently selected frame’s
terminal.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Input methods provide convenient ways of entering non-ASCII characters from the keyboard. Unlike coding systems, which translate non-ASCII characters to and from encodings meant to be read by programs, input methods provide human-friendly commands. (See Input Methods in The GNU Emacs Manual, for information on how users use input methods to enter text.) How to define input methods is not yet documented in this manual, but here we describe how to use them.
Each input method has a name, which is currently a string; in the future, symbols may also be usable as input method names.
This variable holds the name of the input method now active in the
current buffer. (It automatically becomes local in each buffer when set
in any fashion.) It is nil if no input method is active in the
buffer now.
This variable holds the default input method for commands that choose an
input method. Unlike current-input-method, this variable is
normally global.
This command activates input method input-method for the current
buffer. It also sets default-input-method to input-method.
If input-method is nil, this command deactivates any input
method for the current buffer.
This function reads an input method name with the minibuffer, prompting
with prompt. If default is non-nil, that is returned
by default, if the user enters empty input. However, if
inhibit-null is non-nil, empty input signals an error.
The returned value is a string.
This variable defines all the supported input methods. Each element defines one input method, and should have the form:
(input-method language-env activate-func title description args...)
Here input-method is the input method name, a string; language-env is another string, the name of the language environment this input method is recommended for. (That serves only for documentation purposes.)
activate-func is a function to call to activate this method. The args, if any, are passed as arguments to activate-func. All told, the arguments to activate-func are input-method and the args.
title is a string to display in the mode line while this method is active. description is a string describing this method and what it is good for.
The fundamental interface to input methods is through the
variable input-method-function. See section Reading One Event,
and Invoking the Input Method.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
POSIX defines a concept of “locales” which control which language to use in language-related features. These Emacs variables control how Emacs interacts with these features.
This variable specifies the coding system to use for decoding system
error messages and—on X Window system only—keyboard input, for
encoding the format argument to format-time-string, and for
decoding the return value of format-time-string.
This variable specifies the locale to use for generating system error
messages. Changing the locale can cause messages to come out in a
different language or in a different orthography. If the variable is
nil, the locale is specified by environment variables in the
usual POSIX fashion.
This variable specifies the locale to use for formatting time values.
Changing the locale can cause messages to appear according to the
conventions of a different language. If the variable is nil, the
locale is specified by environment variables in the usual POSIX fashion.
This function returns locale data item for the current POSIX locale, if available. item should be one of these symbols:
codesetReturn the character set as a string (locale item CODESET).
daysReturn a 7-element vector of day names (locale items
DAY_1 through DAY_7);
monthsReturn a 12-element vector of month names (locale items MON_1
through MON_12).
paperReturn a list (width height) for the default paper
size measured in millimeters (locale items PAPER_WIDTH and
PAPER_HEIGHT).
If the system can’t provide the requested information, or if
item is not one of those symbols, the value is nil. All
strings in the return value are decoded using
locale-coding-system. See Locales in The GNU Libc Manual,
for more information about locales and locale items.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GNU Emacs provides two ways to search through a buffer for specified text: exact string searches and regular expression searches. After a regular expression search, you can examine the match data to determine which text matched the whole regular expression or various portions of it.
| 33.1 Searching for Strings | Search for an exact match. | |
| 33.2 Searching and Case | Case-independent or case-significant searching. | |
| 33.3 Regular Expressions | Describing classes of strings. | |
| 33.4 Regular Expression Searching | Searching for a match for a regexp. | |
| 33.5 POSIX Regular Expression Searching | Searching POSIX-style for the longest match. | |
| 33.6 The Match Data | Finding out which part of the text matched, after a string or regexp search. | |
| 33.7 Search and Replace | Commands that loop, searching and replacing. | |
| 33.8 Standard Regular Expressions Used in Editing | Useful regexps for finding sentences, pages,... |
The ‘skip-chars…’ functions also perform a kind of searching. See section Skipping Characters. To search for changes in character properties, see Text Property Search Functions.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These are the primitive functions for searching through the text in a
buffer. They are meant for use in programs, but you may call them
interactively. If you do so, they prompt for the search string; the
arguments limit and noerror are nil, and repeat
is 1. For more details on interactive searching, see Searching and Replacement in The GNU Emacs Manual.
These search functions convert the search string to multibyte if the buffer is multibyte; they convert the search string to unibyte if the buffer is unibyte. See section Text Representations.
This function searches forward from point for an exact match for string. If successful, it sets point to the end of the occurrence found, and returns the new value of point. If no match is found, the value and side effects depend on noerror (see below).
In the following example, point is initially at the beginning of the
line. Then (search-forward "fox") moves point after the last
letter of ‘fox’:
---------- Buffer: foo ---------- ∗The quick brown fox jumped over the lazy dog. ---------- Buffer: foo ----------
(search-forward "fox")
⇒ 20
---------- Buffer: foo ----------
The quick brown fox∗ jumped over the lazy dog.
---------- Buffer: foo ----------
The argument limit specifies the bound to the search, and should
be a position in the current buffer. No match extending after
that position is accepted. If limit is omitted or nil, it
defaults to the end of the accessible portion of the buffer.
What happens when the search fails depends on the value of
noerror. If noerror is nil, a search-failed
error is signaled. If noerror is t, search-forward
returns nil and does nothing. If noerror is neither
nil nor t, then search-forward moves point to the
upper bound and returns nil.
The argument noerror only affects valid searches which fail to find a match. Invalid arguments cause errors regardless of noerror.
If repeat is a positive number n, it serves as a repeat count: the search is repeated n times, each time starting at the end of the previous time’s match. If these successive searches succeed, the function succeeds, moving point and returning its new value. Otherwise the search fails, with results depending on the value of noerror, as described above. If repeat is a negative number -n, it serves as a repeat count of n for a search in the opposite (backward) direction.
This function searches backward from point for string. It is
like search-forward, except that it searches backwards rather
than forwards. Backward searches leave point at the beginning of the
match.
This function searches forward from point for a “word” match for string. If it finds a match, it sets point to the end of the match found, and returns the new value of point.
Word matching regards string as a sequence of words, disregarding punctuation that separates them. It searches the buffer for the same sequence of words. Each word must be distinct in the buffer (searching for the word ‘ball’ does not match the word ‘balls’), but the details of punctuation and spacing are ignored (searching for ‘ball boy’ does match ‘ball. Boy!’).
In this example, point is initially at the beginning of the buffer; the search leaves it between the ‘y’ and the ‘!’.
---------- Buffer: foo ---------- ∗He said "Please! Find the ball boy!" ---------- Buffer: foo ----------
(word-search-forward "Please find the ball, boy.")
⇒ 39
---------- Buffer: foo ----------
He said "Please! Find
the ball boy∗!"
---------- Buffer: foo ----------
If limit is non-nil, it must be a position in the current
buffer; it specifies the upper bound to the search. The match found
must not extend after that position.
If noerror is nil, then word-search-forward signals
an error if the search fails. If noerror is t, then it
returns nil instead of signaling an error. If noerror is
neither nil nor t, it moves point to limit (or the
end of the accessible portion of the buffer) and returns nil.
If repeat is non-nil, then the search is repeated that many
times. Point is positioned at the end of the last match.
Internally, word-search-forward and related functions use the
function word-search-regexp to convert string to a
regular expression that ignores punctuation.
This command is identical to word-search-forward, except that
the beginning or the end of string need not match a word
boundary, unless string begins or ends in whitespace.
For instance, searching for ‘ball boy’ matches ‘ball boyee’,
but does not match ‘balls boy’.
This function searches backward from point for a word match to
string. This function is just like word-search-forward
except that it searches backward and normally leaves point at the
beginning of the match.
This command is identical to word-search-backward, except that
the beginning or the end of string need not match a word
boundary, unless string begins or ends in whitespace.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
By default, searches in Emacs ignore the case of the text they are searching through; if you specify searching for ‘FOO’, then ‘Foo’ or ‘foo’ is also considered a match. This applies to regular expressions, too; thus, ‘[aB]’ would match ‘a’ or ‘A’ or ‘b’ or ‘B’.
If you do not want this feature, set the variable
case-fold-search to nil. Then all letters must match
exactly, including case. This is a buffer-local variable; altering the
variable affects only the current buffer. (See section Introduction to Buffer-Local Variables.) Alternatively, you may change the default value.
In Lisp code, you will more typically use let to bind
case-fold-search to the desired value.
Note that the user-level incremental search feature handles case distinctions differently. When the search string contains only lower case letters, the search ignores case, but when the search string contains one or more upper case letters, the search becomes case-sensitive. But this has nothing to do with the searching functions used in Lisp code. See Incremental Search in The GNU Emacs Manual.
This buffer-local variable determines whether searches should ignore
case. If the variable is nil they do not ignore case; otherwise
(and by default) they do ignore case.
This variable determines whether the higher-level replacement
functions should preserve case. If the variable is nil, that
means to use the replacement text verbatim. A non-nil value
means to convert the case of the replacement text according to the
text being replaced.
This variable is used by passing it as an argument to the function
replace-match. See section Replacing the Text that Matched.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A regular expression, or regexp for short, is a pattern that denotes a (possibly infinite) set of strings. Searching for matches for a regexp is a very powerful operation. This section explains how to write regexps; the following section says how to search for them.
For interactive development of regular expressions, you can use the M-x re-builder command. It provides a convenient interface for creating regular expressions, by giving immediate visual feedback in a separate buffer. As you edit the regexp, all its matches in the target buffer are highlighted. Each parenthesized sub-expression of the regexp is shown in a distinct face, which makes it easier to verify even very complex regexps.
| 33.3.1 Syntax of Regular Expressions | Rules for writing regular expressions. | |
| 33.3.2 Complex Regexp Example | Illustrates regular expression syntax. | |
| 33.3.3 Regular Expression Functions | Functions for operating on regular expressions. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Regular expressions have a syntax in which a few characters are special constructs and the rest are ordinary. An ordinary character is a simple regular expression that matches that character and nothing else. The special characters are ‘.’, ‘*’, ‘+’, ‘?’, ‘[’, ‘^’, ‘$’, and ‘\’; no new special characters will be defined in the future. The character ‘]’ is special if it ends a character alternative (see later). The character ‘-’ is special inside a character alternative. A ‘[:’ and balancing ‘:]’ enclose a character class inside a character alternative. Any other character appearing in a regular expression is ordinary, unless a ‘\’ precedes it.
For example, ‘f’ is not a special character, so it is ordinary, and therefore ‘f’ is a regular expression that matches the string ‘f’ and no other string. (It does not match the string ‘fg’, but it does match a part of that string.) Likewise, ‘o’ is a regular expression that matches only ‘o’.
Any two regular expressions a and b can be concatenated. The result is a regular expression that matches a string if a matches some amount of the beginning of that string and b matches the rest of the string.
As a simple example, we can concatenate the regular expressions ‘f’ and ‘o’ to get the regular expression ‘fo’, which matches only the string ‘fo’. Still trivial. To do something more powerful, you need to use one of the special regular expression constructs.
| 33.3.1.1 Special Characters in Regular Expressions | Special characters in regular expressions. | |
| 33.3.1.2 Character Classes | Character classes used in regular expressions. | |
| 33.3.1.3 Backslash Constructs in Regular Expressions | Backslash-sequences in regular expressions. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here is a list of the characters that are special in a regular expression.
is a special character that matches any single character except a newline. Using concatenation, we can make regular expressions like ‘a.b’, which matches any three-character string that begins with ‘a’ and ends with ‘b’.
is not a construct by itself; it is a postfix operator that means to match the preceding regular expression repetitively as many times as possible. Thus, ‘o*’ matches any number of ‘o’s (including no ‘o’s).
‘*’ always applies to the smallest possible preceding expression. Thus, ‘fo*’ has a repeating ‘o’, not a repeating ‘fo’. It matches ‘f’, ‘fo’, ‘foo’, and so on.
The matcher processes a ‘*’ construct by matching, immediately, as many repetitions as can be found. Then it continues with the rest of the pattern. If that fails, backtracking occurs, discarding some of the matches of the ‘*’-modified construct in the hope that that will make it possible to match the rest of the pattern. For example, in matching ‘ca*ar’ against the string ‘caaar’, the ‘a*’ first tries to match all three ‘a’s; but the rest of the pattern is ‘ar’ and there is only ‘r’ left to match, so this try fails. The next alternative is for ‘a*’ to match only two ‘a’s. With this choice, the rest of the regexp matches successfully.
Warning: Nested repetition operators can run for an indefinitely long time, if they lead to ambiguous matching. For example, trying to match the regular expression ‘\(x+y*\)*a’ against the string ‘xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz’ could take hours before it ultimately fails. Emacs must try each way of grouping the ‘x’s before concluding that none of them can work. Even worse, ‘\(x*\)*’ can match the null string in infinitely many ways, so it causes an infinite loop. To avoid these problems, check nested repetitions carefully, to make sure that they do not cause combinatorial explosions in backtracking.
is a postfix operator, similar to ‘*’ except that it must match the preceding expression at least once. So, for example, ‘ca+r’ matches the strings ‘car’ and ‘caaaar’ but not the string ‘cr’, whereas ‘ca*r’ matches all three strings.
is a postfix operator, similar to ‘*’ except that it must match the preceding expression either once or not at all. For example, ‘ca?r’ matches ‘car’ or ‘cr’; nothing else.
These are “non-greedy” variants of the operators ‘*’, ‘+’ and ‘?’. Where those operators match the largest possible substring (consistent with matching the entire containing expression), the non-greedy variants match the smallest possible substring (consistent with matching the entire containing expression).
For example, the regular expression ‘c[ad]*a’ when applied to the string ‘cdaaada’ matches the whole string; but the regular expression ‘c[ad]*?a’, applied to that same string, matches just ‘cda’. (The smallest possible match here for ‘[ad]*?’ that permits the whole expression to match is ‘d’.)
is a character alternative, which begins with ‘[’ and is terminated by ‘]’. In the simplest case, the characters between the two brackets are what this character alternative can match.
Thus, ‘[ad]’ matches either one ‘a’ or one ‘d’, and ‘[ad]*’ matches any string composed of just ‘a’s and ‘d’s (including the empty string). It follows that ‘c[ad]*r’ matches ‘cr’, ‘car’, ‘cdr’, ‘caddaar’, etc.
You can also include character ranges in a character alternative, by writing the starting and ending characters with a ‘-’ between them. Thus, ‘[a-z]’ matches any lower-case ASCII letter. Ranges may be intermixed freely with individual characters, as in ‘[a-z$%.]’, which matches any lower case ASCII letter or ‘$’, ‘%’ or period.
If case-fold-search is non-nil, ‘[a-z]’ also
matches upper-case letters. Note that a range like ‘[a-z]’ is
not affected by the locale’s collation sequence, it always represents
a sequence in ASCII order.
Note also that the usual regexp special characters are not special inside a character alternative. A completely different set of characters is special inside character alternatives: ‘]’, ‘-’ and ‘^’.
To include a ‘]’ in a character alternative, you must make it the first character. For example, ‘[]a]’ matches ‘]’ or ‘a’. To include a ‘-’, write ‘-’ as the first or last character of the character alternative, or put it after a range. Thus, ‘[]-]’ matches both ‘]’ and ‘-’. (As explained below, you cannot use ‘\]’ to include a ‘]’ inside a character alternative, since ‘\’ is not special there.)
To include ‘^’ in a character alternative, put it anywhere but at the beginning.
If a range starts with a unibyte character c and ends with a multibyte character c2, the range is divided into two parts: one spans the unibyte characters ‘c..?\377’, the other the multibyte characters ‘c1..c2’, where c1 is the first character of the charset to which c2 belongs.
A character alternative can also specify named character classes (see section Character Classes). This is a POSIX feature. For example, ‘[[:ascii:]]’ matches any ASCII character. Using a character class is equivalent to mentioning each of the characters in that class; but the latter is not feasible in practice, since some classes include thousands of different characters.
‘[^’ begins a complemented character alternative. This matches any character except the ones specified. Thus, ‘[^a-z0-9A-Z]’ matches all characters except letters and digits.
‘^’ is not special in a character alternative unless it is the first character. The character following the ‘^’ is treated as if it were first (in other words, ‘-’ and ‘]’ are not special there).
A complemented character alternative can match a newline, unless newline is
mentioned as one of the characters not to match. This is in contrast to
the handling of regexps in programs such as grep.
You can specify named character classes, just like in character alternatives. For instance, ‘[^[:ascii:]]’ matches any non-ASCII character. See section Character Classes.
When matching a buffer, ‘^’ matches the empty string, but only at the beginning of a line in the text being matched (or the beginning of the accessible portion of the buffer). Otherwise it fails to match anything. Thus, ‘^foo’ matches a ‘foo’ that occurs at the beginning of a line.
When matching a string instead of a buffer, ‘^’ matches at the beginning of the string or after a newline character.
For historical compatibility reasons, ‘^’ can be used only at the beginning of the regular expression, or after ‘\(’, ‘\(?:’ or ‘\|’.
is similar to ‘^’ but matches only at the end of a line (or the end of the accessible portion of the buffer). Thus, ‘x+$’ matches a string of one ‘x’ or more at the end of a line.
When matching a string instead of a buffer, ‘$’ matches at the end of the string or before a newline character.
For historical compatibility reasons, ‘$’ can be used only at the end of the regular expression, or before ‘\)’ or ‘\|’.
has two functions: it quotes the special characters (including ‘\’), and it introduces additional special constructs.
Because ‘\’ quotes special characters, ‘\$’ is a regular expression that matches only ‘$’, and ‘\[’ is a regular expression that matches only ‘[’, and so on.
Note that ‘\’ also has special meaning in the read syntax of Lisp
strings (see section String Type), and must be quoted with ‘\’. For
example, the regular expression that matches the ‘\’ character is
‘\\’. To write a Lisp string that contains the characters
‘\\’, Lisp syntax requires you to quote each ‘\’ with another
‘\’. Therefore, the read syntax for a regular expression matching
‘\’ is "\\\\".
Please note: For historical compatibility, special characters are treated as ordinary ones if they are in contexts where their special meanings make no sense. For example, ‘*foo’ treats ‘*’ as ordinary since there is no preceding expression on which the ‘*’ can act. It is poor practice to depend on this behavior; quote the special character anyway, regardless of where it appears.
As a ‘\’ is not special inside a character alternative, it can
never remove the special meaning of ‘-’ or ‘]’. So you
should not quote these characters when they have no special meaning
either. This would not clarify anything, since backslashes can
legitimately precede these characters where they have special
meaning, as in ‘[^\]’ ("[^\\]" for Lisp string syntax),
which matches any single character except a backslash.
In practice, most ‘]’ that occur in regular expressions close a character alternative and hence are special. However, occasionally a regular expression may try to match a complex pattern of literal ‘[’ and ‘]’. In such situations, it sometimes may be necessary to carefully parse the regexp from the start to determine which square brackets enclose a character alternative. For example, ‘[^][]]’ consists of the complemented character alternative ‘[^][]’ (which matches any single character that is not a square bracket), followed by a literal ‘]’.
The exact rules are that at the beginning of a regexp, ‘[’ is special and ‘]’ not. This lasts until the first unquoted ‘[’, after which we are in a character alternative; ‘[’ is no longer special (except when it starts a character class) but ‘]’ is special, unless it immediately follows the special ‘[’ or that ‘[’ followed by a ‘^’. This lasts until the next special ‘]’ that does not end a character class. This ends the character alternative and restores the ordinary syntax of regular expressions; an unquoted ‘[’ is special again and a ‘]’ not.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here is a table of the classes you can use in a character alternative, and what they mean:
This matches any ASCII character (codes 0–127).
This matches any letter or digit. (At present, for multibyte characters, it matches anything that has word syntax.)
This matches any letter. (At present, for multibyte characters, it matches anything that has word syntax.)
This matches space and tab only.
This matches any ASCII control character.
This matches ‘0’ through ‘9’. Thus, ‘[-+[:digit:]]’ matches any digit, as well as ‘+’ and ‘-’.
This matches graphic characters—everything except ASCII control characters, space, and the delete character.
This matches any lower-case letter, as determined by the current case
table (see section The Case Table). If case-fold-search is
non-nil, this also matches any upper-case letter.
This matches any multibyte character (see section Text Representations).
This matches any non-ASCII character.
This matches printing characters—everything except ASCII control characters and the delete character.
This matches any punctuation character. (At present, for multibyte characters, it matches anything that has non-word syntax.)
This matches any character that has whitespace syntax (see section Table of Syntax Classes).
This matches any unibyte character (see section Text Representations).
This matches any upper-case letter, as determined by the current case
table (see section The Case Table). If case-fold-search is
non-nil, this also matches any lower-case letter.
This matches any character that has word syntax (see section Table of Syntax Classes).
This matches the hexadecimal digits: ‘0’ through ‘9’, ‘a’ through ‘f’ and ‘A’ through ‘F’.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
For the most part, ‘\’ followed by any character matches only that character. However, there are several exceptions: certain sequences starting with ‘\’ that have special meanings. Here is a table of the special ‘\’ constructs.
specifies an alternative. Two regular expressions a and b with ‘\|’ in between form an expression that matches anything that either a or b matches.
Thus, ‘foo\|bar’ matches either ‘foo’ or ‘bar’ but no other string.
‘\|’ applies to the largest possible surrounding expressions. Only a surrounding ‘\( … \)’ grouping can limit the grouping power of ‘\|’.
If you need full backtracking capability to handle multiple uses of ‘\|’, use the POSIX regular expression functions (see section POSIX Regular Expression Searching).
is a postfix operator that repeats the previous pattern exactly m times. Thus, ‘x\{5\}’ matches the string ‘xxxxx’ and nothing else. ‘c[ad]\{3\}r’ matches string such as ‘caaar’, ‘cdddr’, ‘cadar’, and so on.
is a more general postfix operator that specifies repetition with a minimum of m repeats and a maximum of n repeats. If m is omitted, the minimum is 0; if n is omitted, there is no maximum.
For example, ‘c[ad]\{1,2\}r’ matches the strings ‘car’,
‘cdr’, ‘caar’, ‘cadr’, ‘cdar’, and ‘cddr’, and
nothing else.
‘\{0,1\}’ or ‘\{,1\}’ is equivalent to ‘?’.
‘\{0,\}’ or ‘\{,\}’ is equivalent to ‘*’.
‘\{1,\}’ is equivalent to ‘+’.
is a grouping construct that serves three purposes:
This last application is not a consequence of the idea of a parenthetical grouping; it is a separate feature that was assigned as a second meaning to the same ‘\( … \)’ construct because, in practice, there was usually no conflict between the two meanings. But occasionally there is a conflict, and that led to the introduction of shy groups.
is the shy group construct. A shy group serves the first two purposes of an ordinary group (controlling the nesting of other operators), but it does not get a number, so you cannot refer back to its value with ‘\digit’. Shy groups are particularly useful for mechanically-constructed regular expressions, because they can be added automatically without altering the numbering of ordinary, non-shy groups.
Shy groups are also called non-capturing or unnumbered groups.
is the explicitly numbered group construct. Normal groups get their number implicitly, based on their position, which can be inconvenient. This construct allows you to force a particular group number. There is no particular restriction on the numbering, e.g., you can have several groups with the same number in which case the last one to match (i.e., the rightmost match) will win. Implicitly numbered groups always get the smallest integer larger than the one of any previous group.
matches the same text that matched the digitth occurrence of a grouping (‘\( … \)’) construct.
In other words, after the end of a group, the matcher remembers the beginning and end of the text matched by that group. Later on in the regular expression you can use ‘\’ followed by digit to match that same text, whatever it may have been.
The strings matching the first nine grouping constructs appearing in the entire regular expression passed to a search or matching function are assigned numbers 1 through 9 in the order that the open parentheses appear in the regular expression. So you can use ‘\1’ through ‘\9’ to refer to the text matched by the corresponding grouping constructs.
For example, ‘\(.*\)\1’ matches any newline-free string that is composed of two identical halves. The ‘\(.*\)’ matches the first half, which may be anything, but the ‘\1’ that follows must match the same exact text.
If a ‘\( … \)’ construct matches more than once (which can happen, for instance, if it is followed by ‘*’), only the last match is recorded.
If a particular grouping construct in the regular expression was never matched—for instance, if it appears inside of an alternative that wasn’t used, or inside of a repetition that repeated zero times—then the corresponding ‘\digit’ construct never matches anything. To use an artificial example, ‘\(foo\(b*\)\|lose\)\2’ cannot match ‘lose’: the second alternative inside the larger group matches it, but then ‘\2’ is undefined and can’t match anything. But it can match ‘foobb’, because the first alternative matches ‘foob’ and ‘\2’ matches ‘b’.
matches any word-constituent character. The editor syntax table determines which characters these are. See section Syntax Tables.
matches any character that is not a word constituent.
matches any character whose syntax is code. Here code is a character that represents a syntax code: thus, ‘w’ for word constituent, ‘-’ for whitespace, ‘(’ for open parenthesis, etc. To represent whitespace syntax, use either ‘-’ or a space character. See section Table of Syntax Classes, for a list of syntax codes and the characters that stand for them.
matches any character whose syntax is not code.
matches any character whose category is c. Here c is a
character that represents a category: thus, ‘c’ for Chinese
characters or ‘g’ for Greek characters in the standard category
table. You can see the list of all the currently defined categories
with M-x describe-categories RET. You can also define
your own categories in addition to the standard ones using the
define-category function (see section Categories).
matches any character whose category is not c.
The following regular expression constructs match the empty string—that is, they don’t use up any characters—but whether they match depends on the context. For all, the beginning and end of the accessible portion of the buffer are treated as if they were the actual beginning and end of the buffer.
matches the empty string, but only at the beginning of the buffer or string being matched against.
matches the empty string, but only at the end of the buffer or string being matched against.
matches the empty string, but only at point. (This construct is not defined when matching against a string.)
matches the empty string, but only at the beginning or end of a word. Thus, ‘\bfoo\b’ matches any occurrence of ‘foo’ as a separate word. ‘\bballs?\b’ matches ‘ball’ or ‘balls’ as a separate word.
‘\b’ matches at the beginning or end of the buffer (or string) regardless of what text appears next to it.
matches the empty string, but not at the beginning or end of a word, nor at the beginning or end of the buffer (or string).
matches the empty string, but only at the beginning of a word. ‘\<’ matches at the beginning of the buffer (or string) only if a word-constituent character follows.
matches the empty string, but only at the end of a word. ‘\>’ matches at the end of the buffer (or string) only if the contents end with a word-constituent character.
matches the empty string, but only at the beginning of a symbol. A symbol is a sequence of one or more word or symbol constituent characters. ‘\_<’ matches at the beginning of the buffer (or string) only if a symbol-constituent character follows.
matches the empty string, but only at the end of a symbol. ‘\_>’ matches at the end of the buffer (or string) only if the contents end with a symbol-constituent character.
Not every string is a valid regular expression. For example, a string
that ends inside a character alternative without a terminating ‘]’
is invalid, and so is a string that ends with a single ‘\’. If
an invalid regular expression is passed to any of the search functions,
an invalid-regexp error is signaled.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here is a complicated regexp which was formerly used by Emacs to
recognize the end of a sentence together with any whitespace that
follows. (Nowadays Emacs uses a similar but more complex default
regexp constructed by the function sentence-end.
See section Standard Regular Expressions Used in Editing.)
Below, we show first the regexp as a string in Lisp syntax (to distinguish spaces from tab characters), and then the result of evaluating it. The string constant begins and ends with a double-quote. ‘\"’ stands for a double-quote as part of the string, ‘\\’ for a backslash as part of the string, ‘\t’ for a tab and ‘\n’ for a newline.
"[.?!][]\"')}]*\\($\\| $\\|\t\\| \\)[ \t\n]*"
⇒ "[.?!][]\"')}]*\\($\\| $\\| \\| \\)[
]*"
In the output, tab and newline appear as themselves.
This regular expression contains four parts in succession and can be deciphered as follows:
[.?!]The first part of the pattern is a character alternative that matches any one of three characters: period, question mark, and exclamation mark. The match must begin with one of these three characters. (This is one point where the new default regexp used by Emacs differs from the old. The new value also allows some non-ASCII characters that end a sentence without any following whitespace.)
[]\"')}]*The second part of the pattern matches any closing braces and quotation
marks, zero or more of them, that may follow the period, question mark
or exclamation mark. The \" is Lisp syntax for a double-quote in
a string. The ‘*’ at the end indicates that the immediately
preceding regular expression (a character alternative, in this case) may be
repeated zero or more times.
\\($\\| $\\|\t\\| \\)The third part of the pattern matches the whitespace that follows the end of a sentence: the end of a line (optionally with a space), or a tab, or two spaces. The double backslashes mark the parentheses and vertical bars as regular expression syntax; the parentheses delimit a group and the vertical bars separate alternatives. The dollar sign is used to match the end of a line.
[ \t\n]*Finally, the last part of the pattern matches any additional whitespace beyond the minimum needed to end a sentence.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These functions operate on regular expressions.
This function returns a regular expression whose only exact match is
string. Using this regular expression in looking-at will
succeed only if the next characters in the buffer are string;
using it in a search function will succeed if the text being searched
contains string. See section Regular Expression Searching.
This allows you to request an exact string match or search when calling a function that wants a regular expression.
(regexp-quote "^The cat$")
⇒ "\\^The cat\\$"
One use of regexp-quote is to combine an exact string match with
context described as a regular expression. For example, this searches
for the string that is the value of string, surrounded by
whitespace:
(re-search-forward (concat "\\s-" (regexp-quote string) "\\s-"))
This function returns an efficient regular expression that will match any of the strings in the list strings. This is useful when you need to make matching or searching as fast as possible—for example, for Font Lock mode17.
If the optional argument paren is non-nil, then the
returned regular expression is always enclosed by at least one
parentheses-grouping construct. If paren is words, then
that construct is additionally surrounded by ‘\<’ and ‘\>’;
alternatively, if paren is symbols, then that construct
is additionally surrounded by ‘\_<’ and ‘\_>’
(symbols is often appropriate when matching
programming-language keywords and the like).
This simplified definition of regexp-opt produces a
regular expression which is equivalent to the actual value
(but not as efficient):
(defun regexp-opt (strings &optional paren)
(let ((open-paren (if paren "\\(" ""))
(close-paren (if paren "\\)" "")))
(concat open-paren
(mapconcat 'regexp-quote strings "\\|")
close-paren)))
This function returns the total number of grouping constructs (parenthesized expressions) in regexp. This does not include shy groups (see section Backslash Constructs in Regular Expressions).
This function returns a regular expression matching a character in the list of characters chars.
(regexp-opt-charset '(?a ?b ?c ?d ?e))
⇒ "[a-e]"
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In GNU Emacs, you can search for the next match for a regular
expression (see section Syntax of Regular Expressions) either incrementally or not.
For incremental search commands, see Regular
Expression Search in The GNU Emacs Manual. Here we describe
only the search functions useful in programs. The principal one is
re-search-forward.
These search functions convert the regular expression to multibyte if the buffer is multibyte; they convert the regular expression to unibyte if the buffer is unibyte. See section Text Representations.
This function searches forward in the current buffer for a string of text that is matched by the regular expression regexp. The function skips over any amount of text that is not matched by regexp, and leaves point at the end of the first match found. It returns the new value of point.
If limit is non-nil, it must be a position in the current
buffer. It specifies the upper bound to the search. No match
extending after that position is accepted.
If repeat is supplied, it must be a positive number; the search
is repeated that many times; each repetition starts at the end of the
previous match. If all these successive searches succeed, the search
succeeds, moving point and returning its new value. Otherwise the
search fails. What re-search-forward does when the search
fails depends on the value of noerror:
nilSignal a search-failed error.
tDo nothing and return nil.
Move point to limit (or the end of the accessible portion of the
buffer) and return nil.
In the following example, point is initially before the ‘T’. Evaluating the search call moves point to the end of that line (between the ‘t’ of ‘hat’ and the newline).
---------- Buffer: foo ---------- I read "∗The cat in the hat comes back" twice. ---------- Buffer: foo ----------
(re-search-forward "[a-z]+" nil t 5)
⇒ 27
---------- Buffer: foo ----------
I read "The cat in the hat∗
comes back" twice.
---------- Buffer: foo ----------
This function searches backward in the current buffer for a string of text that is matched by the regular expression regexp, leaving point at the beginning of the first text found.
This function is analogous to re-search-forward, but they are not
simple mirror images. re-search-forward finds the match whose
beginning is as close as possible to the starting point. If
re-search-backward were a perfect mirror image, it would find the
match whose end is as close as possible. However, in fact it finds the
match whose beginning is as close as possible (and yet ends before the
starting point). The reason for this is that matching a regular
expression at a given spot always works from beginning to end, and
starts at a specified beginning position.
A true mirror-image of re-search-forward would require a special
feature for matching regular expressions from end to beginning. It’s
not worth the trouble of implementing that.
This function returns the index of the start of the first match for
the regular expression regexp in string, or nil if
there is no match. If start is non-nil, the search starts
at that index in string.
For example,
(string-match
"quick" "The quick brown fox jumped quickly.")
⇒ 4
(string-match
"quick" "The quick brown fox jumped quickly." 8)
⇒ 27
The index of the first character of the string is 0, the index of the second character is 1, and so on.
After this function returns, the index of the first character beyond
the match is available as (match-end 0). See section The Match Data.
(string-match
"quick" "The quick brown fox jumped quickly." 8)
⇒ 27
(match-end 0)
⇒ 32
This predicate function does what string-match does, but it
avoids modifying the match data.
This function determines whether the text in the current buffer directly
following point matches the regular expression regexp. “Directly
following” means precisely that: the search is “anchored” and it can
succeed only starting with the first character following point. The
result is t if so, nil otherwise.
This function does not move point, but it does update the match data.
See section The Match Data. If you need to test for a match without modifying
the match data, use looking-at-p, described below.
In this example, point is located directly before the ‘T’. If it
were anywhere else, the result would be nil.
---------- Buffer: foo ----------
I read "∗The cat in the hat
comes back" twice.
---------- Buffer: foo ----------
(looking-at "The cat in the hat$")
⇒ t
This function returns t if regexp matches the text
immediately before point (i.e., ending at point), and nil otherwise.
Because regular expression matching works only going forward, this is implemented by searching backwards from point for a match that ends at point. That can be quite slow if it has to search a long distance. You can bound the time required by specifying limit, which says not to search before limit. In this case, the match that is found must begin at or after limit. Here’s an example:
---------- Buffer: foo ----------
I read "∗The cat in the hat
comes back" twice.
---------- Buffer: foo ----------
(looking-back "read \"" 3)
⇒ t
(looking-back "read \"" 4)
⇒ nil
If greedy is non-nil, this function extends the match
backwards as far as possible, stopping when a single additional
previous character cannot be part of a match for regexp. When the
match is extended, its starting position is allowed to occur before
limit.
As a general recommendation, try to avoid using looking-back
wherever possible, since it is slow. For this reason, there are no
plans to add a looking-back-p function.
This predicate function works like looking-at, but without
updating the match data.
If this variable is non-nil, it should be a regular expression
that says how to search for whitespace. In that case, any group of
spaces in a regular expression being searched for stands for use of
this regular expression. However, spaces inside of constructs such as
‘[…]’ and ‘*’, ‘+’, ‘?’ are not affected by
search-spaces-regexp.
Since this variable affects all regular expression search and match constructs, you should bind it temporarily for as small as possible a part of the code.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The usual regular expression functions do backtracking when necessary to handle the ‘\|’ and repetition constructs, but they continue this only until they find some match. Then they succeed and report the first match found.
This section describes alternative search functions which perform the full backtracking specified by the POSIX standard for regular expression matching. They continue backtracking until they have tried all possibilities and found all matches, so they can report the longest match, as required by POSIX. This is much slower, so use these functions only when you really need the longest match.
The POSIX search and match functions do not properly support the non-greedy repetition operators (see section non-greedy). This is because POSIX backtracking conflicts with the semantics of non-greedy repetition.
This is like re-search-forward except that it performs the full
backtracking specified by the POSIX standard for regular expression
matching.
This is like re-search-backward except that it performs the full
backtracking specified by the POSIX standard for regular expression
matching.
This is like looking-at except that it performs the full
backtracking specified by the POSIX standard for regular expression
matching.
This is like string-match except that it performs the full
backtracking specified by the POSIX standard for regular expression
matching.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs keeps track of the start and end positions of the segments of text found during a search; this is called the match data. Thanks to the match data, you can search for a complex pattern, such as a date in a mail message, and then extract parts of the match under control of the pattern.
Because the match data normally describe the most recent search only, you must be careful not to do another search inadvertently between the search you wish to refer back to and the use of the match data. If you can’t avoid another intervening search, you must save and restore the match data around it, to prevent it from being overwritten.
Notice that all functions are allowed to overwrite the match data unless they’re explicitly documented not to do so. A consequence is that functions that are run implicitly in the background (see section Timers for Delayed Execution, and Idle Timers) should likely save and restore the match data explicitly.
| 33.6.1 Replacing the Text that Matched | Replacing a substring that was matched. | |
| 33.6.2 Simple Match Data Access | Accessing single items of match data, such as where a particular subexpression started. | |
| 33.6.3 Accessing the Entire Match Data | Accessing the entire match data at once, as a list. | |
| 33.6.4 Saving and Restoring the Match Data | Saving and restoring the match data. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This function replaces all or part of the text matched by the last search. It works by means of the match data.
This function performs a replacement operation on a buffer or string.
If you did the last search in a buffer, you should omit the
string argument or specify nil for it, and make sure that
the current buffer is the one in which you performed the last search.
Then this function edits the buffer, replacing the matched text with
replacement. It leaves point at the end of the replacement
text.
If you performed the last search on a string, pass the same string as string. Then this function returns a new string, in which the matched text is replaced by replacement.
If fixedcase is non-nil, then replace-match uses
the replacement text without case conversion; otherwise, it converts
the replacement text depending upon the capitalization of the text to
be replaced. If the original text is all upper case, this converts
the replacement text to upper case. If all words of the original text
are capitalized, this capitalizes all the words of the replacement
text. If all the words are one-letter and they are all upper case,
they are treated as capitalized words rather than all-upper-case
words.
If literal is non-nil, then replacement is inserted
exactly as it is, the only alterations being case changes as needed.
If it is nil (the default), then the character ‘\’ is treated
specially. If a ‘\’ appears in replacement, then it must be
part of one of the following sequences:
This stands for the entire text being replaced.
This stands for the text that matched the nth subexpression in the original regexp. Subexpressions are those expressions grouped inside ‘\(…\)’. If the nth subexpression never matched, an empty string is substituted.
This stands for a single ‘\’ in the replacement text.
This stands for itself (for compatibility with replace-regexp
and related commands; see Regexp Replace in The GNU
Emacs Manual).
Any other character following ‘\’ signals an error.
The substitutions performed by ‘\&’ and ‘\n’ occur after case conversion, if any. Therefore, the strings they substitute are never case-converted.
If subexp is non-nil, that says to replace just
subexpression number subexp of the regexp that was matched, not
the entire match. For example, after matching ‘foo \(ba*r\)’,
calling replace-match with 1 as subexp means to replace
just the text that matched ‘\(ba*r\)’.
This function returns the text that would be inserted into the buffer
by replace-match, but without modifying the buffer. It is
useful if you want to present the user with actual replacement result,
with constructs like ‘\n’ or ‘\&’ substituted with
matched groups. Arguments replacement and optional
fixedcase, literal, string and subexp have the
same meaning as for replace-match.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section explains how to use the match data to find out what was matched by the last search or match operation, if it succeeded.
You can ask about the entire matching text, or about a particular parenthetical subexpression of a regular expression. The count argument in the functions below specifies which. If count is zero, you are asking about the entire match. If count is positive, it specifies which subexpression you want.
Recall that the subexpressions of a regular expression are those expressions grouped with escaped parentheses, ‘\(…\)’. The countth subexpression is found by counting occurrences of ‘\(’ from the beginning of the whole regular expression. The first subexpression is numbered 1, the second 2, and so on. Only regular expressions can have subexpressions—after a simple string search, the only information available is about the entire match.
Every successful search sets the match data. Therefore, you should
query the match data immediately after searching, before calling any
other function that might perform another search. Alternatively, you
may save and restore the match data (see section Saving and Restoring the Match Data) around
the call to functions that could perform another search. Or use the
functions that explicitly do not modify the match data;
e.g., string-match-p.
A search which fails may or may not alter the match data. In the current implementation, it does not, but we may change it in the future. Don’t try to rely on the value of the match data after a failing search.
This function returns, as a string, the text matched in the last search or match operation. It returns the entire text if count is zero, or just the portion corresponding to the countth parenthetical subexpression, if count is positive.
If the last such operation was done against a string with
string-match, then you should pass the same string as the
argument in-string. After a buffer search or match,
you should omit in-string or pass nil for it; but you
should make sure that the current buffer when you call
match-string is the one in which you did the searching or
matching. Failure to follow this advice will lead to incorrect results.
The value is nil if count is out of range, or for a
subexpression inside a ‘\|’ alternative that wasn’t used or a
repetition that repeated zero times.
This function is like match-string except that the result
has no text properties.
This function returns the position of the start of the text matched by the last regular expression searched for, or a subexpression of it.
If count is zero, then the value is the position of the start of the entire match. Otherwise, count specifies a subexpression in the regular expression, and the value of the function is the starting position of the match for that subexpression.
The value is nil for a subexpression inside a ‘\|’
alternative that wasn’t used or a repetition that repeated zero times.
This function is like match-beginning except that it returns the
position of the end of the match, rather than the position of the
beginning.
Here is an example of using the match data, with a comment showing the positions within the text:
(string-match "\\(qu\\)\\(ick\\)"
"The quick fox jumped quickly.")
;0123456789
⇒ 4
(match-string 0 "The quick fox jumped quickly.")
⇒ "quick"
(match-string 1 "The quick fox jumped quickly.")
⇒ "qu"
(match-string 2 "The quick fox jumped quickly.")
⇒ "ick"
(match-beginning 1) ; The beginning of the match ⇒ 4 ; with ‘qu’ is at index 4.
(match-beginning 2) ; The beginning of the match ⇒ 6 ; with ‘ick’ is at index 6.
(match-end 1) ; The end of the match ⇒ 6 ; with ‘qu’ is at index 6. (match-end 2) ; The end of the match ⇒ 9 ; with ‘ick’ is at index 9.
Here is another example. Point is initially located at the beginning of the line. Searching moves point to between the space and the word ‘in’. The beginning of the entire match is at the 9th character of the buffer (‘T’), and the beginning of the match for the first subexpression is at the 13th character (‘c’).
(list
(re-search-forward "The \\(cat \\)")
(match-beginning 0)
(match-beginning 1))
⇒ (17 9 13)
---------- Buffer: foo ----------
I read "The cat ∗in the hat comes back" twice.
^ ^
9 13
---------- Buffer: foo ----------
(In this case, the index returned is a buffer position; the first character of the buffer counts as 1.)
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The functions match-data and set-match-data read or
write the entire match data, all at once.
This function returns a list of positions (markers or integers) that
record all the information on the text that the last search matched.
Element zero is the position of the beginning of the match for the
whole expression; element one is the position of the end of the match
for the expression. The next two elements are the positions of the
beginning and end of the match for the first subexpression, and so on.
In general, element
number 2n
corresponds to (match-beginning n); and
element
number 2n + 1
corresponds to (match-end n).
Normally all the elements are markers or nil, but if
integers is non-nil, that means to use integers instead
of markers. (In that case, the buffer itself is appended as an
additional element at the end of the list, to facilitate complete
restoration of the match data.) If the last match was done on a
string with string-match, then integers are always used,
since markers can’t point into a string.
If reuse is non-nil, it should be a list. In that case,
match-data stores the match data in reuse. That is,
reuse is destructively modified. reuse does not need to
have the right length. If it is not long enough to contain the match
data, it is extended. If it is too long, the length of reuse
stays the same, but the elements that were not used are set to
nil. The purpose of this feature is to reduce the need for
garbage collection.
If reseat is non-nil, all markers on the reuse list
are reseated to point to nowhere.
As always, there must be no possibility of intervening searches between
the call to a search function and the call to match-data that is
intended to access the match data for that search.
(match-data)
⇒ (#<marker at 9 in foo>
#<marker at 17 in foo>
#<marker at 13 in foo>
#<marker at 17 in foo>)
This function sets the match data from the elements of match-list,
which should be a list that was the value of a previous call to
match-data. (More precisely, anything that has the same format
will work.)
If match-list refers to a buffer that doesn’t exist, you don’t get an error; that sets the match data in a meaningless but harmless way.
If reseat is non-nil, all markers on the match-list list
are reseated to point to nowhere.
store-match-data is a semi-obsolete alias for set-match-data.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When you call a function that may search, you may need to save and restore the match data around that call, if you want to preserve the match data from an earlier search for later use. Here is an example that shows the problem that arises if you fail to save the match data:
(re-search-forward "The \\(cat \\)")
⇒ 48
(foo) ; foo does more searching.
(match-end 0)
⇒ 61 ; Unexpected result—not 48!
You can save and restore the match data with save-match-data:
This macro executes body, saving and restoring the match data around it. The return value is the value of the last form in body.
You could use set-match-data together with match-data to
imitate the effect of the special form save-match-data. Here is
how:
(let ((data (match-data)))
(unwind-protect
… ; Ok to change the original match data.
(set-match-data data)))
Emacs automatically saves and restores the match data when it runs process filter functions (see section Process Filter Functions) and process sentinels (see section Sentinels: Detecting Process Status Changes).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If you want to find all matches for a regexp in part of the buffer,
and replace them, the best way is to write an explicit loop using
re-search-forward and replace-match, like this:
(while (re-search-forward "foo[ \t]+bar" nil t) (replace-match "foobar"))
See section Replacing the Text that Matched, for a
description of replace-match.
However, replacing matches in a string is more complex, especially if you want to do it efficiently. So Emacs provides a function to do this.
This function copies string and searches it for matches for
regexp, and replaces them with rep. It returns the
modified copy. If start is non-nil, the search for
matches starts at that index in string, so matches starting
before that index are not changed.
This function uses replace-match to do the replacement, and it
passes the optional arguments fixedcase, literal and
subexp along to replace-match.
Instead of a string, rep can be a function. In that case,
replace-regexp-in-string calls rep for each match,
passing the text of the match as its sole argument. It collects the
value rep returns and passes that to replace-match as the
replacement string. The match data at this point are the result
of matching regexp against a substring of string.
If you want to write a command along the lines of query-replace,
you can use perform-replace to do the work.
This function is the guts of query-replace and related
commands. It searches for occurrences of from-string in the
text between positions start and end and replaces some or
all of them. If start is nil (or omitted), point is used
instead, and the end of the buffer’s accessible portion is used for
end.
If query-flag is nil, it replaces all
occurrences; otherwise, it asks the user what to do about each one.
If regexp-flag is non-nil, then from-string is
considered a regular expression; otherwise, it must match literally. If
delimited-flag is non-nil, then only replacements
surrounded by word boundaries are considered.
The argument replacements specifies what to replace occurrences with. If it is a string, that string is used. It can also be a list of strings, to be used in cyclic order.
If replacements is a cons cell, (function . data), this means to call function after each match to
get the replacement text. This function is called with two arguments:
data, and the number of replacements already made.
If repeat-count is non-nil, it should be an integer. Then
it specifies how many times to use each of the strings in the
replacements list before advancing cyclically to the next one.
If from-string contains upper-case letters, then
perform-replace binds case-fold-search to nil, and
it uses the replacements without altering their case.
Normally, the keymap query-replace-map defines the possible
user responses for queries. The argument map, if
non-nil, specifies a keymap to use instead of
query-replace-map.
This function uses one of two functions to search for the next
occurrence of from-string. These functions are specified by the
values of two variables: replace-re-search-function and
replace-search-function. The former is called when the
argument regexp-flag is non-nil, the latter when it is
nil.
This variable holds a special keymap that defines the valid user
responses for perform-replace and the commands that use it, as
well as y-or-n-p and map-y-or-n-p. This map is unusual
in two ways:
read-key-sequence to get the input; instead, they read a single
event and look it up “by hand”.
Here are the meaningful “bindings” for query-replace-map.
Several of them are meaningful only for query-replace and
friends.
actDo take the action being considered—in other words, “yes”.
skipDo not take action for this question—in other words, “no”.
exitAnswer this question “no”, and give up on the entire series of questions, assuming that the answers will be “no”.
exit-prefixLike exit, but add the key that was pressed to
unread-command-events (see section Miscellaneous Event Input Features).
act-and-exitAnswer this question “yes”, and give up on the entire series of questions, assuming that subsequent answers will be “no”.
act-and-showAnswer this question “yes”, but show the results—don’t advance yet to the next question.
automaticAnswer this question and all subsequent questions in the series with “yes”, without further user interaction.
backupMove back to the previous place that a question was asked about.
editEnter a recursive edit to deal with this question—instead of any other action that would normally be taken.
edit-replacementEdit the replacement for this question in the minibuffer.
delete-and-editDelete the text being considered, then enter a recursive edit to replace it.
recenterscroll-upscroll-downscroll-other-windowscroll-other-window-downPerform the specified window scroll operation, then ask the same
question again. Only y-or-n-p and related functions use this
answer.
quitPerform a quit right away. Only y-or-n-p and related functions
use this answer.
helpDisplay some help, then ask again.
This variable holds a keymap that extends query-replace-map by
providing additional keybindings that are useful in multi-buffer
replacements. The additional “bindings” are:
automatic-allAnswer this question and all subsequent questions in the series with “yes”, without further user interaction, for all remaining buffers.
exit-currentAnswer this question “no”, and give up on the entire series of questions for the current buffer. Continue to the next buffer in the sequence.
This variable specifies a function that perform-replace calls
to search for the next string to replace. Its default value is
search-forward. Any other value should name a function of 3
arguments: the first 3 arguments of search-forward
(see section Searching for Strings).
This variable specifies a function that perform-replace calls
to search for the next regexp to replace. Its default value is
re-search-forward. Any other value should name a function of 3
arguments: the first 3 arguments of re-search-forward
(see section Regular Expression Searching).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes some variables that hold regular expressions used for certain purposes in editing:
This is the regular expression describing line-beginnings that separate
pages. The default value is "^\014" (i.e., "^^L" or
"^\C-l"); this matches a line that starts with a formfeed
character.
The following two regular expressions should not assume the match always starts at the beginning of a line; they should not use ‘^’ to anchor the match. Most often, the paragraph commands do check for a match only at the beginning of a line, which means that ‘^’ would be superfluous. When there is a nonzero left margin, they accept matches that start after the left margin. In that case, a ‘^’ would be incorrect. However, a ‘^’ is harmless in modes where a left margin is never used.
This is the regular expression for recognizing the beginning of a line
that separates paragraphs. (If you change this, you may have to
change paragraph-start also.) The default value is
"[ \t\f]*$", which matches a line that consists entirely of
spaces, tabs, and form feeds (after its left margin).
This is the regular expression for recognizing the beginning of a line
that starts or separates paragraphs. The default value is
"\f\\|[ \t]*$", which matches a line containing only
whitespace or starting with a form feed (after its left margin).
If non-nil, the value should be a regular expression describing
the end of a sentence, including the whitespace following the
sentence. (All paragraph boundaries also end sentences, regardless.)
If the value is nil, as it is by default, then the function
sentence-end constructs the regexp. That is why you
should always call the function sentence-end to obtain the
regexp to be used to recognize the end of a sentence.
This function returns the value of the variable sentence-end,
if non-nil. Otherwise it returns a default value based on the
values of the variables sentence-end-double-space
(see Definition of sentence-end-double-space),
sentence-end-without-period, and
sentence-end-without-space.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A syntax table specifies the syntactic role of each character in a buffer. It can be used to determine where words, symbols, and other syntactic constructs begin and end. This information is used by many Emacs facilities, including Font Lock mode (see section Font Lock Mode) and the various complex movement commands (see section Motion).
| 34.1 Syntax Table Concepts | Basic concepts of syntax tables. | |
| 34.2 Syntax Descriptors | How characters are classified. | |
| 34.3 Syntax Table Functions | How to create, examine and alter syntax tables. | |
| 34.4 Syntax Properties | Overriding syntax with text properties. | |
| 34.5 Motion and Syntax | Moving over characters with certain syntaxes. | |
| 34.6 Parsing Expressions | Parsing balanced expressions using the syntax table. | |
| 34.7 Syntax Table Internals | How syntax table information is stored. | |
| 34.8 Categories | Another way of classifying character syntax. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A syntax table is a data structure which can be used to look up the syntax class and other syntactic properties of each character. Syntax tables are used by Lisp programs for scanning and moving across text.
Internally, a syntax table is a char-table (see section Char-Tables).
The element at index c describes the character with code
c; its value is a cons cell which specifies the syntax of the
character in question. See section Syntax Table Internals, for details.
However, instead of using aset and aref to modify and
inspect syntax table contents, you should usually use the higher-level
functions char-syntax and modify-syntax-entry, which are
described in Syntax Table Functions.
This function returns t if object is a syntax table.
Each buffer has its own major mode, and each major mode has its own
idea of the syntax class of various characters. For example, in Lisp
mode, the character ‘;’ begins a comment, but in C mode, it
terminates a statement. To support these variations, the syntax table
is local to each buffer. Typically, each major mode has its own
syntax table, which it installs in all buffers that use that mode.
For example, the variable emacs-lisp-mode-syntax-table holds
the syntax table used by Emacs Lisp mode, and
c-mode-syntax-table holds the syntax table used by C mode.
Changing a major mode’s syntax table alters the syntax in all of that
mode’s buffers, as well as in any buffers subsequently put in that
mode. Occasionally, several similar modes share one syntax table.
See section Major Mode Examples, for an example of how to set up a syntax
table.
A syntax table can inherit from another syntax table, which is called its parent syntax table. A syntax table can leave the syntax class of some characters unspecified, by giving them the “inherit” syntax class; such a character then acquires the syntax class specified by the parent syntax table (see section Table of Syntax Classes). Emacs defines a standard syntax table, which is the default parent syntax table, and is also the syntax table used by Fundamental mode.
This function returns the standard syntax table, which is the syntax table used in Fundamental mode.
Syntax tables are not used by the Emacs Lisp reader, which has its own built-in syntactic rules which cannot be changed. (Some Lisp systems provide ways to redefine the read syntax, but we decided to leave this feature out of Emacs Lisp for simplicity.)
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The syntax class of a character describes its syntactic role. Each syntax table specifies the syntax class of each character. There is no necessary relationship between the class of a character in one syntax table and its class in any other table.
Each syntax class is designated by a mnemonic character, which serves as the name of the class when you need to specify a class. Usually, this designator character is one that is often assigned that class; however, its meaning as a designator is unvarying and independent of what syntax that character currently has. Thus, ‘\’ as a designator character always means “escape character” syntax, regardless of whether the ‘\’ character actually has that syntax in the current syntax table. See section Table of Syntax Classes, for a list of syntax classes and their designator characters.
A syntax descriptor is a Lisp string that describes the syntax
class and other syntactic properties of a character. When you want to
modify the syntax of a character, that is done by calling the function
modify-syntax-entry and passing a syntax descriptor as one of
its arguments (see section Syntax Table Functions).
The first character in a syntax descriptor must be a syntax class designator character. The second character, if present, specifies a matching character (e.g., in Lisp, the matching character for ‘(’ is ‘)’); a space specifies that there is no matching character. Then come characters specifying additional syntax properties (see section Syntax Flags).
If no matching character or flags are needed, only one character (specifying the syntax class) is sufficient.
For example, the syntax descriptor for the character ‘*’ in C
mode is ". 23" (i.e., punctuation, matching character slot
unused, second character of a comment-starter, first character of a
comment-ender), and the entry for ‘/’ is ‘. 14’ (i.e.,
punctuation, matching character slot unused, first character of a
comment-starter, second character of a comment-ender).
Emacs also defines raw syntax descriptors, which are used to describe syntax classes at a lower level. See section Syntax Table Internals.
| 34.2.1 Table of Syntax Classes | Table of syntax classes. | |
| 34.2.2 Syntax Flags | Additional flags each character can have. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here is a table of syntax classes, the characters that designate them, their meanings, and examples of their use.
Characters that separate symbols and words from each other. Typically, whitespace characters have no other syntactic significance, and multiple whitespace characters are syntactically equivalent to a single one. Space, tab, and formfeed are classified as whitespace in almost all major modes.
This syntax class can be designated by either ‘ ’ or ‘-’. Both designators are equivalent.
Parts of words in human languages. These are typically used in variable and command names in programs. All upper- and lower-case letters, and the digits, are typically word constituents.
Extra characters used in variable and command names along with word constituents. Examples include the characters ‘$&*+-_<>’ in Lisp mode, which may be part of a symbol name even though they are not part of English words. In standard C, the only non-word-constituent character that is valid in symbols is underscore (‘_’).
Characters used as punctuation in a human language, or used in a programming language to separate symbols from one another. Some programming language modes, such as Emacs Lisp mode, have no characters in this class since the few characters that are not symbol or word constituents all have other uses. Other programming language modes, such as C mode, use punctuation syntax for operators.
Characters used in dissimilar pairs to surround sentences or expressions. Such a grouping is begun with an open parenthesis character and terminated with a close. Each open parenthesis character matches a particular close parenthesis character, and vice versa. Normally, Emacs indicates momentarily the matching open parenthesis when you insert a close parenthesis. See section Blinking Parentheses.
In human languages, and in C code, the parenthesis pairs are ‘()’, ‘[]’, and ‘{}’. In Emacs Lisp, the delimiters for lists and vectors (‘()’ and ‘[]’) are classified as parenthesis characters.
Characters used to delimit string constants. The same string quote character appears at the beginning and the end of a string. Such quoted strings do not nest.
The parsing facilities of Emacs consider a string as a single token. The usual syntactic meanings of the characters in the string are suppressed.
The Lisp modes have two string quote characters: double-quote (‘"’) and vertical bar (‘|’). ‘|’ is not used in Emacs Lisp, but it is used in Common Lisp. C also has two string quote characters: double-quote for strings, and single-quote (‘'’) for character constants.
Human text has no string quote characters. We do not want quotation marks to turn off the usual syntactic properties of other characters in the quotation.
Characters that start an escape sequence, such as is used in string and character constants. The character ‘\’ belongs to this class in both C and Lisp. (In C, it is used thus only inside strings, but it turns out to cause no trouble to treat it this way throughout C code.)
Characters in this class count as part of words if
words-include-escapes is non-nil. See section Motion by Words.
Characters used to quote the following character so that it loses its normal syntactic meaning. This differs from an escape character in that only the character immediately following is ever affected.
Characters in this class count as part of words if
words-include-escapes is non-nil. See section Motion by Words.
This class is used for backslash in TeX mode.
Similar to string quote characters, except that the syntactic properties of the characters between the delimiters are not suppressed. Only TeX mode uses a paired delimiter presently—the ‘$’ that both enters and leaves math mode.
Characters used for syntactic operators that are considered as part of an expression if they appear next to one. In Lisp modes, these characters include the apostrophe, ‘'’ (used for quoting), the comma, ‘,’ (used in macros), and ‘#’ (used in the read syntax for certain data types).
Characters used in various languages to delimit comments. Human text has no comment characters. In Lisp, the semicolon (‘;’) starts a comment and a newline or formfeed ends one.
This syntax class does not specify a particular syntax. It says to look in the standard syntax table to find the syntax of this character.
Characters that start or end a special kind of comment. Any generic comment delimiter matches any generic comment delimiter, but they cannot match a comment starter or comment ender; generic comment delimiters can only match each other.
This syntax class is primarily meant for use with the
syntax-table text property (see section Syntax Properties). You
can mark any range of characters as forming a comment, by giving the
first and last characters of the range syntax-table properties
identifying them as generic comment delimiters.
Characters that start or end a string. This class differs from the string quote class in that any generic string delimiter can match any other generic string delimiter; but they do not match ordinary string quote characters.
This syntax class is primarily meant for use with the
syntax-table text property (see section Syntax Properties). You
can mark any range of characters as forming a string constant, by
giving the first and last characters of the range syntax-table
properties identifying them as generic string delimiters.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In addition to the classes, entries for characters in a syntax table can specify flags. There are eight possible flags, represented by the characters ‘1’, ‘2’, ‘3’, ‘4’, ‘b’, ‘c’, ‘n’, and ‘p’.
All the flags except ‘p’ are used to describe comment delimiters. The digit flags are used for comment delimiters made up of 2 characters. They indicate that a character can also be part of a comment sequence, in addition to the syntactic properties associated with its character class. The flags are independent of the class and each other for the sake of characters such as ‘*’ in C mode, which is a punctuation character, and the second character of a start-of-comment sequence (‘/*’), and the first character of an end-of-comment sequence (‘*/’). The flags ‘b’, ‘c’, and ‘n’ are used to qualify the corresponding comment delimiter.
Here is a table of the possible flags for a character c, and what they mean:
Emacs supports several comment styles simultaneously in any one syntax table. A comment style is a set of flags ‘b’, ‘c’, and ‘n’, so there can be up to 8 different comment styles. Each comment delimiter has a style and only matches comment delimiters of the same style. Thus if a comment starts with the comment-start sequence of style “bn”, it will extend until the next matching comment-end sequence of style “bn”.
The appropriate comment syntax settings for C++ can be as follows:
‘124’
‘23b’
‘>’
This defines four comment-delimiting sequences:
This is a comment-start sequence for “b” style because the second character, ‘*’, has the ‘b’ flag.
This is a comment-start sequence for “a” style because the second character, ‘/’, does not have the ‘b’ flag.
This is a comment-end sequence for “b” style because the first character, ‘*’, has the ‘b’ flag.
This is a comment-end sequence for “a” style, because the newline character does not have the ‘b’ flag.
The function backward-prefix-chars moves back over these
characters, as well as over characters whose primary syntax class is
prefix (‘'’). See section Motion and Syntax.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In this section we describe functions for creating, accessing and altering syntax tables.
This function creates a new syntax table. If table is
non-nil, the parent of the new syntax table is table;
otherwise, the parent is the standard syntax table.
In the new syntax table, all characters are initially given the “inherit” (‘@’) syntax class, i.e., their syntax is inherited from the parent table (see section Table of Syntax Classes).
This function constructs a copy of table and returns it. If
table is omitted or nil, it returns a copy of the
standard syntax table. Otherwise, an error is signaled if table
is not a syntax table.
This function sets the syntax entry for char according to
syntax-descriptor. char must be a character, or a cons
cell of the form (min . max); in the latter case,
the function sets the syntax entries for all characters in the range
between min and max, inclusive.
The syntax is changed only for table, which defaults to the current buffer’s syntax table, and not in any other syntax table.
The argument syntax-descriptor is a syntax descriptor, i.e., a string whose first character is a syntax class designator and whose second and subsequent characters optionally specify a matching character and syntax flags. See section Syntax Descriptors. An error is signaled if syntax-descriptor is not a valid syntax descriptor.
This function always returns nil. The old syntax information in
the table for this character is discarded.
Examples:
;; Put the space character in class whitespace.
(modify-syntax-entry ?\s " ")
⇒ nil
;; Make ‘$’ an open parenthesis character, ;; with ‘^’ as its matching close. (modify-syntax-entry ?$ "(^") ⇒ nil
;; Make ‘^’ a close parenthesis character, ;; with ‘$’ as its matching open. (modify-syntax-entry ?^ ")$") ⇒ nil
;; Make ‘/’ a punctuation character, ;; the first character of a start-comment sequence, ;; and the second character of an end-comment sequence. ;; This is used in C mode. (modify-syntax-entry ?/ ". 14") ⇒ nil
This function returns the syntax class of character, represented by its designator character (see section Table of Syntax Classes). This returns only the class, not its matching character or syntax flags.
The following examples apply to C mode. (We use string to make
it easier to see the character returned by char-syntax.)
;; Space characters have whitespace syntax class.
(string (char-syntax ?\s))
⇒ " "
;; Forward slash characters have punctuation syntax.
;; Note that this char-syntax call does not reveal
;; that it is also part of comment-start and -end sequences.
(string (char-syntax ?/))
⇒ "."
;; Open parenthesis characters have open parenthesis syntax.
;; Note that this char-syntax call does not reveal that
;; it has a matching character, ‘)’.
(string (char-syntax ?\())
⇒ "("
This function makes table the syntax table for the current buffer. It returns table.
This function returns the current syntax table, which is the table for the current buffer.
This command displays the contents of the syntax table of buffer (by default, the current buffer) in a help buffer.
This macro executes body using table as the current syntax table. It returns the value of the last form in body, after restoring the old current syntax table.
Since each buffer has its own current syntax table, we should make that
more precise: with-syntax-table temporarily alters the current
syntax table of whichever buffer is current at the time the macro
execution starts. Other buffers are not affected.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When the syntax table is not flexible enough to specify the syntax of
a language, you can override the syntax table for specific character
occurrences in the buffer, by applying a syntax-table text
property. See section Text Properties, for how to apply text properties.
The valid values of syntax-table text property are:
If the property value is a syntax table, that table is used instead of the current buffer’s syntax table to determine the syntax for the underlying text character.
(syntax-code . matching-char)A cons cell of this format is a raw syntax descriptor (see section Syntax Table Internals), which directly specifies a syntax class for the underlying text character.
nilIf the property is nil, the character’s syntax is determined from
the current syntax table in the usual way.
If this is non-nil, the syntax scanning functions, like
forward-sexp, pay attention to syntax text properties.
Otherwise they use only the current syntax table.
This variable, if non-nil, should store a function for applying
syntax-table properties to a specified stretch of text. It is
intended to be used by major modes to install a function which applies
syntax-table properties in some mode-appropriate way.
The function is called by syntax-ppss (see section Finding the Parse State for a Position),
and by Font Lock mode during syntactic fontification (see section Syntactic Font Lock). It is called with two arguments, start and
end, which are the starting and ending positions of the text on
which it should act. It is allowed to call syntax-ppss on any
position before end. However, it should not call
syntax-ppss-flush-cache; so, it is not allowed to call
syntax-ppss on some position and later modify the buffer at an
earlier position.
This abnormal hook is run by the syntax parsing code prior to calling
syntax-propertize-function. Its role is to help locate safe
starting and ending buffer positions for passing to
syntax-propertize-function. For example, a major mode can add
a function to this hook to identify multi-line syntactic constructs,
and ensure that the boundaries do not fall in the middle of one.
Each function in this hook should accept two arguments, start
and end. It should return either a cons cell of two adjusted
buffer positions, (new-start . new-end), or
nil if no adjustment is necessary. The hook functions are run
in turn, repeatedly, until they all return nil.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes functions for moving across characters that have certain syntax classes.
This function moves point forward across characters having syntax classes mentioned in syntaxes (a string of syntax class characters). It stops when it encounters the end of the buffer, or position limit (if specified), or a character it is not supposed to skip.
If syntaxes starts with ‘^’, then the function skips characters whose syntax is not in syntaxes.
The return value is the distance traveled, which is a nonnegative integer.
This function moves point backward across characters whose syntax classes are mentioned in syntaxes. It stops when it encounters the beginning of the buffer, or position limit (if specified), or a character it is not supposed to skip.
If syntaxes starts with ‘^’, then the function skips characters whose syntax is not in syntaxes.
The return value indicates the distance traveled. It is an integer that is zero or less.
This function moves point backward over any number of characters with expression prefix syntax. This includes both characters in the expression prefix syntax class, and characters with the ‘p’ flag.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes functions for parsing and scanning balanced expressions. We will refer to such expressions as sexps, following the terminology of Lisp, even though these functions can act on languages other than Lisp. Basically, a sexp is either a balanced parenthetical grouping, a string, or a “symbol” (i.e., a sequence of characters whose syntax is either word constituent or symbol constituent). However, characters in the expression prefix syntax class (see section Table of Syntax Classes) are treated as part of the sexp if they appear next to it.
The syntax table controls the interpretation of characters, so these functions can be used for Lisp expressions when in Lisp mode and for C expressions when in C mode. See section Moving over Balanced Expressions, for convenient higher-level functions for moving over balanced expressions.
A character’s syntax controls how it changes the state of the parser, rather than describing the state itself. For example, a string delimiter character toggles the parser state between “in-string” and “in-code”, but the syntax of characters does not directly say whether they are inside a string. For example (note that 15 is the syntax code for generic string delimiters),
(put-text-property 1 9 'syntax-table '(15 . nil))
does not tell Emacs that the first eight chars of the current buffer are a string, but rather that they are all string delimiters. As a result, Emacs treats them as four consecutive empty string constants.
| 34.6.1 Motion Commands Based on Parsing | Motion functions that work by parsing. | |
| 34.6.2 Finding the Parse State for a Position | Determining the syntactic state of a position. | |
| 34.6.3 Parser State | How Emacs represents a syntactic state. | |
| 34.6.4 Low-Level Parsing | Parsing across a specified region. | |
| 34.6.5 Parameters to Control Parsing | Parameters that affect parsing. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes simple point-motion functions that operate based on parsing expressions.
This function scans forward count balanced parenthetical groupings from position from. It returns the position where the scan stops. If count is negative, the scan moves backwards.
If depth is nonzero, treat the starting position as being depth parentheses deep. The scanner moves forward or backward through the buffer until the depth changes to zero count times. Hence, a positive value for depth has the effect of moving out depth levels of parenthesis from the starting position, while a negative depth has the effect of moving deeper by -depth levels of parenthesis.
Scanning ignores comments if parse-sexp-ignore-comments is
non-nil.
If the scan reaches the beginning or end of the accessible part of the
buffer before it has scanned over count parenthetical groupings,
the return value is nil if the depth at that point is zero; if
the depth is non-zero, a scan-error error is signaled.
This function scans forward count sexps from position from. It returns the position where the scan stops. If count is negative, the scan moves backwards.
Scanning ignores comments if parse-sexp-ignore-comments is
non-nil.
If the scan reaches the beginning or end of (the accessible part of) the
buffer while in the middle of a parenthetical grouping, an error is
signaled. If it reaches the beginning or end between groupings but
before count is used up, nil is returned.
This function moves point forward across count complete comments
(that is, including the starting delimiter and the terminating
delimiter if any), plus any whitespace encountered on the way. It
moves backward if count is negative. If it encounters anything
other than a comment or whitespace, it stops, leaving point at the
place where it stopped. This includes (for instance) finding the end
of a comment when moving forward and expecting the beginning of one.
The function also stops immediately after moving over the specified
number of complete comments. If count comments are found as
expected, with nothing except whitespace between them, it returns
t; otherwise it returns nil.
This function cannot tell whether the “comments” it traverses are embedded within a string. If they look like comments, it treats them as comments.
To move forward over all comments and whitespace following point, use
(forward-comment (buffer-size)). (buffer-size) is a
good argument to use, because the number of comments in the buffer
cannot exceed that many.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
For syntactic analysis, such as in indentation, often the useful thing is to compute the syntactic state corresponding to a given buffer position. This function does that conveniently.
This function returns the parser state that the parser would reach at position pos starting from the beginning of the buffer. See section Parser State, for a description of the parser state.
The return value is the same as if you call the low-level parsing
function parse-partial-sexp to parse from the beginning of the
buffer to pos (see section Low-Level Parsing). However,
syntax-ppss uses a cache to speed up the computation. Due to
this optimization, the second value (previous complete subexpression)
and sixth value (minimum parenthesis depth) in the returned parser
state are not meaningful.
This function has a side effect: it adds a buffer-local entry to
before-change-functions (see section Change Hooks) for
syntax-ppss-flush-cache (see below). This entry keeps the
cache consistent as the buffer is modified. However, the cache might
not be updated if syntax-ppss is called while
before-change-functions is temporarily let-bound, or if the
buffer is modified without running the hook, such as when using
inhibit-modification-hooks. In those cases, it is necessary to
call syntax-ppss-flush-cache explicitly.
This function flushes the cache used by syntax-ppss, starting
at position beg. The remaining arguments, ignored-args,
are ignored; this function accepts them so that it can be directly
used on hooks such as before-change-functions (see section Change Hooks).
Major modes can make syntax-ppss run faster by specifying
where it needs to start parsing.
If this is non-nil, it should be a function that moves to an
earlier buffer position where the parser state is equivalent to
nil—in other words, a position outside of any comment,
string, or parenthesis. syntax-ppss uses it to further
optimize its computations, when the cache gives no help.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A parser state is a list of ten elements describing the state
of the syntactic parser, after it parses the text between a specified
starting point and a specified end point in the buffer. Parsing
functions such as syntax-ppss
(see section Finding the Parse State for a Position)
return a parser state as the value. Some parsing functions accept a
parser state as an argument, for resuming parsing.
Here are the meanings of the elements of the parser state:
nil if none.
nil if none.
nil if inside a string. More precisely, this is the
character that will terminate the string, or t if a generic
string delimiter character should terminate it.
t if inside a non-nestable comment (of any comment style;
see section Syntax Flags); or the comment nesting level if inside a
comment that can be nested.
t if the end point is just after a quote character.
nil if not in a comment or in a
comment of style ‘a’; 1 for a comment of style ‘b’; 2 for a
comment of style ‘c’; and syntax-table for a comment that
should be ended by a generic comment delimiter character.
nil.
Elements 1, 2, and 6 are ignored in a state which you pass as an argument to continue parsing, and elements 8 and 9 are used only in trivial cases. Those elements are mainly used internally by the parser code.
One additional piece of useful information is available from a parser state using this function:
This function extracts, from parser state state, the last position scanned in the parse which was at top level in grammatical structure. “At top level” means outside of any parentheses, comments, or strings.
The value is nil if state represents a parse which has
arrived at a top level position.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The most basic way to use the expression parser is to tell it to start at a given position with a certain state, and parse up to a specified end position.
This function parses a sexp in the current buffer starting at start, not scanning past limit. It stops at position limit or when certain criteria described below are met, and sets point to the location where parsing stops. It returns a parser state describing the status of the parse at the point where it stops.
If the third argument target-depth is non-nil, parsing
stops if the depth in parentheses becomes equal to target-depth.
The depth starts at 0, or at whatever is given in state.
If the fourth argument stop-before is non-nil, parsing
stops when it comes to any character that starts a sexp. If
stop-comment is non-nil, parsing stops when it comes to the
start of a comment. If stop-comment is the symbol
syntax-table, parsing stops after the start of a comment or a
string, or the end of a comment or a string, whichever comes first.
If state is nil, start is assumed to be at the top
level of parenthesis structure, such as the beginning of a function
definition. Alternatively, you might wish to resume parsing in the
middle of the structure. To do this, you must provide a state
argument that describes the initial status of parsing. The value
returned by a previous call to parse-partial-sexp will do
nicely.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If this variable is non-nil, scan-sexps treats all
non-ASCII characters as symbol constituents regardless
of what the syntax table says about them. (However, text properties
can still override the syntax.)
If the value is non-nil, then comments are treated as
whitespace by the functions in this section and by forward-sexp,
scan-lists and scan-sexps.
The behavior of parse-partial-sexp is also affected by
parse-sexp-lookup-properties (see section Syntax Properties).
You can use forward-comment to move forward or backward over
one comment or several comments.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Syntax tables are implemented as char-tables (see section Char-Tables), but most Lisp programs don’t work directly with their elements. Syntax tables do not store syntax data as syntax descriptors (see section Syntax Descriptors); they use an internal format, which is documented in this section. This internal format can also be assigned as syntax properties (see section Syntax Properties).
Each entry in a syntax table is a raw syntax descriptor: a
cons cell of the form (syntax-code
. matching-char). syntax-code is an integer which
encodes the syntax class and syntax flags, according to the table
below. matching-char, if non-nil, specifies a matching
character (similar to the second character in a syntax descriptor).
Here are the syntax codes corresponding to the various syntax classes:
| Code | Class | Code | Class |
| 0 | whitespace | 8 | paired delimiter |
| 1 | punctuation | 9 | escape |
| 2 | word | 10 | character quote |
| 3 | symbol | 11 | comment-start |
| 4 | open parenthesis | 12 | comment-end |
| 5 | close parenthesis | 13 | inherit |
| 6 | expression prefix | 14 | generic comment |
| 7 | string quote | 15 | generic string |
For example, in the standard syntax table, the entry for ‘(’ is
(4 . 41). 41 is the character code for ‘)’.
Syntax flags are encoded in higher order bits, starting 16 bits from the least significant bit. This table gives the power of two which corresponds to each syntax flag.
| Prefix | Flag | Prefix | Flag |
| ‘1’ | (lsh 1 16) | ‘p’ | (lsh 1 20) |
| ‘2’ | (lsh 1 17) | ‘b’ | (lsh 1 21) |
| ‘3’ | (lsh 1 18) | ‘n’ | (lsh 1 22) |
| ‘4’ | (lsh 1 19) |
Given a syntax descriptor desc (a string), this function returns the corresponding raw syntax descriptor.
This function returns the raw syntax descriptor for the character in
the buffer after position pos, taking account of syntax
properties as well as the syntax table. If pos is outside the
buffer’s accessible portion (see section accessible portion),
the return value is nil.
This function returns the syntax code for the raw syntax descriptor syntax. More precisely, it takes the raw syntax descriptor’s syntax-code component, masks off the high 16 bits which record the syntax flags, and returns the resulting integer.
If syntax is nil, the return value is returns nil.
This is so that the expression
(syntax-class (syntax-after pos))
evaluates to nil if pos is outside the buffer’s
accessible portion, without throwing errors or returning an incorrect
code.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Categories provide an alternate way of classifying characters syntactically. You can define several categories as needed, then independently assign each character to one or more categories. Unlike syntax classes, categories are not mutually exclusive; it is normal for one character to belong to several categories.
Each buffer has a category table which records which categories are defined and also which characters belong to each category. Each category table defines its own categories, but normally these are initialized by copying from the standard categories table, so that the standard categories are available in all modes.
Each category has a name, which is an ASCII printing character in
the range ‘ ’ to ‘~’. You specify the name of a category
when you define it with define-category.
The category table is actually a char-table (see section Char-Tables).
The element of the category table at index c is a category
set—a bool-vector—that indicates which categories character c
belongs to. In this category set, if the element at index cat is
t, that means category cat is a member of the set, and that
character c belongs to category cat.
For the next three functions, the optional argument table defaults to the current buffer’s category table.
This function defines a new category, with name char and documentation docstring, for the category table table.
Here’s an example of defining a new category for characters that have strong right-to-left directionality (see section Bidirectional Display) and using it in a special category table:
(defvar special-category-table-for-bidi
(let ((category-table (make-category-table))
(uniprop-table (unicode-property-table-internal 'bidi-class)))
(define-category ?R "Characters of bidi-class R, AL, or RLO"
category-table)
(map-char-table
#'(lambda (key val)
(if (memq val '(R AL RLO))
(modify-category-entry key ?R category-table)))
uniprop-table)
category-table))
This function returns the documentation string of category category in category table table.
(category-docstring ?a)
⇒ "ASCII"
(category-docstring ?l)
⇒ "Latin"
This function returns a category name (a character) which is not
currently defined in table. If all possible categories are in use
in table, it returns nil.
This function returns the current buffer’s category table.
This function returns t if object is a category table,
otherwise nil.
This function returns the standard category table.
This function constructs a copy of table and returns it. If
table is not supplied (or is nil), it returns a copy of the
standard category table. Otherwise, an error is signaled if table
is not a category table.
This function makes table the category table for the current buffer. It returns table.
This creates and returns an empty category table. In an empty category table, no categories have been allocated, and no characters belong to any categories.
This function returns a new category set—a bool-vector—whose initial
contents are the categories listed in the string categories. The
elements of categories should be category names; the new category
set has t for each of those categories, and nil for all
other categories.
(make-category-set "al")
⇒ #&128"\0\0\0\0\0\0\0\0\0\0\0\0\2\20\0\0"
This function returns the category set for character char in the
current buffer’s category table. This is the bool-vector which
records which categories the character char belongs to. The
function char-category-set does not allocate storage, because
it returns the same bool-vector that exists in the category table.
(char-category-set ?a)
⇒ #&128"\0\0\0\0\0\0\0\0\0\0\0\0\2\20\0\0"
This function converts the category set category-set into a string containing the characters that designate the categories that are members of the set.
(category-set-mnemonics (char-category-set ?a))
⇒ "al"
This function modifies the category set of char in category
table table (which defaults to the current buffer’s category
table). char can be a character, or a cons cell of the form
(min . max); in the latter case, the function
modifies the category sets of all characters in the range between
min and max, inclusive.
Normally, it modifies a category set by adding category to it.
But if reset is non-nil, then it deletes category
instead.
This function describes the category specifications in the current
category table. It inserts the descriptions in a buffer, and then
displays that buffer. If buffer-or-name is non-nil, it
describes the category table of that buffer instead.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
An abbreviation or abbrev is a string of characters that may be expanded to a longer string. The user can insert the abbrev string and find it replaced automatically with the expansion of the abbrev. This saves typing.
The set of abbrevs currently in effect is recorded in an abbrev table. Each buffer has a local abbrev table, but normally all buffers in the same major mode share one abbrev table. There is also a global abbrev table. Normally both are used.
An abbrev table is represented as an obarray. See section Creating and Interning Symbols, for information about obarrays. Each abbreviation is represented by a symbol in the obarray. The symbol’s name is the abbreviation; its value is the expansion; its function definition is the hook function for performing the expansion (see section Defining Abbrevs); and its property list cell contains various additional properties, including the use count and the number of times the abbreviation has been expanded (see section Abbrev Properties).
Certain abbrevs, called system abbrevs, are defined by a major
mode instead of the user. A system abbrev is identified by its
non-nil :system property (see section Abbrev Properties).
When abbrevs are saved to an abbrev file, system abbrevs are omitted.
See section Saving Abbrevs in Files.
Because the symbols used for abbrevs are not interned in the usual obarray, they will never appear as the result of reading a Lisp expression; in fact, normally they are never used except by the code that handles abbrevs. Therefore, it is safe to use them in a nonstandard way.
If the minor mode Abbrev mode is enabled, the buffer-local variable
abbrev-mode is non-nil, and abbrevs are automatically
expanded in the buffer. For the user-level commands for abbrevs, see
Abbrev Mode in The GNU Emacs Manual.
| 35.1 Abbrev Tables | Creating and working with abbrev tables. | |
| 35.2 Defining Abbrevs | Specifying abbreviations and their expansions. | |
| 35.3 Saving Abbrevs in Files | Saving abbrevs in files. | |
| 35.4 Looking Up and Expanding Abbreviations | Controlling expansion; expansion subroutines. | |
| 35.5 Standard Abbrev Tables | Abbrev tables used by various major modes. | |
| 35.6 Abbrev Properties | How to read and set abbrev properties. Which properties have which effect. | |
| 35.7 Abbrev Table Properties | How to read and set abbrev table properties. Which properties have which effect. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes how to create and manipulate abbrev tables.
This function creates and returns a new, empty abbrev table—an obarray containing no symbols. It is a vector filled with zeros. props is a property list that is applied to the new table (see section Abbrev Table Properties).
This function returns a non-nil value if object is an
abbrev table.
This function undefines all the abbrevs in abbrev-table, leaving it empty.
This function returns a copy of abbrev-table—a new abbrev table containing the same abbrev definitions. It does not copy any property lists; only the names, values, and functions.
This function defines tabname (a symbol) as an abbrev table
name, i.e., as a variable whose value is an abbrev table. It defines
abbrevs in the table according to definitions, a list of
elements of the form (abbrevname expansion
[hook] [props...]). These elements are passed as
arguments to define-abbrev.
The optional string docstring is the documentation string of the variable tabname. The property list props is applied to the abbrev table (see section Abbrev Table Properties).
If this function is called more than once for the same tabname, subsequent calls add the definitions in definitions to tabname, rather than overwriting the entire original contents. (A subsequent call only overrides abbrevs explicitly redefined or undefined in definitions.)
This is a list of symbols whose values are abbrev tables.
define-abbrev-table adds the new abbrev table name to this list.
This function inserts before point a description of the abbrev table named name. The argument name is a symbol whose value is an abbrev table.
If human is non-nil, the description is human-oriented.
System abbrevs are listed and identified as such. Otherwise the
description is a Lisp expression—a call to define-abbrev-table
that would define name as it is currently defined, but without
the system abbrevs. (The mode or package using name is supposed
to add these to name separately.)
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
define-abbrev is the low-level basic function for defining an
abbrev in an abbrev table.
When a major mode defines a system abbrev, it should call
define-abbrev and specify t for the :system
property. Be aware that any saved non-“system” abbrevs are restored
at startup, i.e., before some major modes are loaded. Therefore, major
modes should not assume that their abbrev tables are empty when they
are first loaded.
This function defines an abbrev named name, in
abbrev-table, to expand to expansion and call hook,
with properties props (see section Abbrev Properties). The return
value is name. The :system property in props is
treated specially here: if it has the value force, then it will
overwrite an existing definition even for a non-“system” abbrev of
the same name.
name should be a string. The argument expansion is
normally the desired expansion (a string), or nil to undefine
the abbrev. If it is anything but a string or nil, then the
abbreviation “expands” solely by running hook.
The argument hook is a function or nil. If hook is
non-nil, then it is called with no arguments after the abbrev is
replaced with expansion; point is located at the end of
expansion when hook is called.
If hook is a non-nil symbol whose no-self-insert
property is non-nil, hook can explicitly control whether
to insert the self-inserting input character that triggered the
expansion. If hook returns non-nil in this case, that
inhibits insertion of the character. By contrast, if hook
returns nil, expand-abbrev (or abbrev-insert)
also returns nil, as if expansion had not really occurred.
Normally, define-abbrev sets the variable
abbrevs-changed to t, if it actually changes the abbrev.
This is so that some commands will offer to save the abbrevs. It
does not do this for a system abbrev, since those aren’t saved anyway.
If this variable is non-nil, it means that the user plans to use
global abbrevs only. This tells the commands that define mode-specific
abbrevs to define global ones instead. This variable does not alter the
behavior of the functions in this section; it is examined by their
callers.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A file of saved abbrev definitions is actually a file of Lisp code.
The abbrevs are saved in the form of a Lisp program to define the same
abbrev tables with the same contents. Therefore, you can load the file
with load (see section How Programs Do Loading). However, the
function quietly-read-abbrev-file is provided as a more
convenient interface. Emacs automatically calls this function at
startup.
User-level facilities such as save-some-buffers can save
abbrevs in a file automatically, under the control of variables
described here.
This is the default file name for reading and saving abbrevs.
This function reads abbrev definitions from a file named filename,
previously written with write-abbrev-file. If filename is
omitted or nil, the file specified in abbrev-file-name is
used.
As the name implies, this function does not display any messages.
A non-nil value for save-abbrevs means that Emacs should
offer to save abbrevs (if any have changed) when files are saved. If
the value is silently, Emacs saves the abbrevs without asking
the user. abbrev-file-name specifies the file to save the
abbrevs in.
This variable is set non-nil by defining or altering any
abbrevs (except system abbrevs). This serves as a flag for various
Emacs commands to offer to save your abbrevs.
Save all abbrev definitions (except system abbrevs), for all abbrev
tables listed in abbrev-table-name-list, in the file
filename, in the form of a Lisp program that when loaded will
define the same abbrevs. If filename is nil or omitted,
abbrev-file-name is used. This function returns nil.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Abbrevs are usually expanded by certain interactive commands,
including self-insert-command. This section describes the
subroutines used in writing such commands, as well as the variables they
use for communication.
This function returns the symbol representing the abbrev named
abbrev. It returns nil if that abbrev is not
defined. The optional second argument table is the abbrev table
in which to look it up. If table is nil, this function
tries first the current buffer’s local abbrev table, and second the
global abbrev table.
This function returns the string that abbrev would expand into (as
defined by the abbrev tables used for the current buffer). It returns
nil if abbrev is not a valid abbrev.
The optional argument table specifies the abbrev table to use,
as in abbrev-symbol.
This command expands the abbrev before point, if any. If point does not
follow an abbrev, this command does nothing. To do the expansion, it
calls the function that is the value of the abbrev-expand-function
variable, with no arguments, and returns whatever that function does.
The default expansion function returns the abbrev symbol if it did
expansion, and nil otherwise. If the abbrev symbol has a hook
function that is a symbol whose no-self-insert property is
non-nil, and if the hook function returns nil as its
value, then the default expansion function returns nil,
even though expansion did occur.
This function inserts the abbrev expansion of abbrev, replacing
the text between start and end. If start is
omitted, it defaults to point. name, if non-nil, should
be the name by which this abbrev was found (a string); it is used to
figure out whether to adjust the capitalization of the expansion. The
function returns abbrev if the abbrev was successfully
inserted.
This command marks the current location of point as the beginning of
an abbrev. The next call to expand-abbrev will use the text
from here to point (where it is then) as the abbrev to expand, rather
than using the previous word as usual.
First, this command expands any abbrev before point, unless arg
is non-nil. (Interactively, arg is the prefix argument.)
Then it inserts a hyphen before point, to indicate the start of the
next abbrev to be expanded. The actual expansion removes the hyphen.
When this is set non-nil, an abbrev entered entirely in upper
case is expanded using all upper case. Otherwise, an abbrev entered
entirely in upper case is expanded by capitalizing each word of the
expansion.
The value of this variable is a buffer position (an integer or a marker)
for expand-abbrev to use as the start of the next abbrev to be
expanded. The value can also be nil, which means to use the
word before point instead. abbrev-start-location is set to
nil each time expand-abbrev is called. This variable is
also set by abbrev-prefix-mark.
The value of this variable is the buffer for which
abbrev-start-location has been set. Trying to expand an abbrev
in any other buffer clears abbrev-start-location. This variable
is set by abbrev-prefix-mark.
This is the abbrev-symbol of the most recent abbrev expanded. This
information is left by expand-abbrev for the sake of the
unexpand-abbrev command (see Expanding
Abbrevs in The GNU Emacs Manual).
This is the location of the most recent abbrev expanded. This contains
information left by expand-abbrev for the sake of the
unexpand-abbrev command.
This is the exact expansion text of the most recent abbrev expanded,
after case conversion (if any). Its value is nil if the abbrev
has already been unexpanded. This contains information left by
expand-abbrev for the sake of the unexpand-abbrev command.
The value of this variable is a function that expand-abbrev
will call with no arguments to do the expansion. The function can do
anything it wants before and after performing the expansion.
It should return the abbrev symbol if expansion took place.
The following sample code shows a simple use of
abbrev-expand-function. It assumes that foo-mode is a
mode for editing certain files in which lines that start with ‘#’
are comments. You want to use Text mode abbrevs for those lines. The
regular local abbrev table, foo-mode-abbrev-table is
appropriate for all other lines. See section Standard Abbrev Tables, for the
definitions of local-abbrev-table and text-mode-abbrev-table.
See section Advising Emacs Lisp Functions, for details of add-function.
(defun foo-mode-abbrev-expand-function (expand)
(if (not (save-excursion (forward-line 0) (eq (char-after) ?#)))
;; Performs normal expansion.
(funcall expand)
;; We're inside a comment: use the text-mode abbrevs.
(let ((local-abbrev-table text-mode-abbrev-table))
(funcall expand))))
(add-hook 'foo-mode-hook
#'(lambda ()
(add-function :around (local 'abbrev-expand-function)
#'foo-mode-abbrev-expand-function)))
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here we list the variables that hold the abbrev tables for the preloaded major modes of Emacs.
This is the abbrev table for mode-independent abbrevs. The abbrevs defined in it apply to all buffers. Each buffer may also have a local abbrev table, whose abbrev definitions take precedence over those in the global table.
The value of this buffer-local variable is the (mode-specific) abbreviation table of the current buffer. It can also be a list of such tables.
The value of this variable is a list of elements of the form
(mode . abbrev-table) where mode is the name
of a variable: if the variable is bound to a non-nil value,
then the abbrev-table is active, otherwise it is ignored.
abbrev-table can also be a list of abbrev tables.
This is the local abbrev table used in Fundamental mode; in other words, it is the local abbrev table in all buffers in Fundamental mode.
This is the local abbrev table used in Text mode.
This is the local abbrev table used in Lisp mode. It is the parent of the local abbrev table used in Emacs Lisp mode. See section Abbrev Table Properties.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Abbrevs have properties, some of which influence the way they work.
You can provide them as arguments to define-abbrev, and
manipulate them with the following functions:
Set the property prop of abbrev to value val.
Return the property prop of abbrev, or nil if the
abbrev has no such property.
The following properties have special meanings:
:countThis property counts the number of times the abbrev has
been expanded. If not explicitly set, it is initialized to 0 by
define-abbrev.
:systemIf non-nil, this property marks the abbrev as a system abbrev.
Such abbrevs are not saved (see section Saving Abbrevs in Files).
:enable-functionIf non-nil, this property should be a function of no
arguments which returns nil if the abbrev should not be used
and t otherwise.
:case-fixedIf non-nil, this property indicates that the case of the
abbrev’s name is significant and should only match a text with the
same pattern of capitalization. It also disables the code that
modifies the capitalization of the expansion.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Like abbrevs, abbrev tables have properties, some of which influence
the way they work. You can provide them as arguments to
define-abbrev-table, and manipulate them with the functions:
Set the property prop of abbrev table table to value val.
Return the property prop of abbrev table table, or nil
if the abbrev has no such property.
The following properties have special meaning:
:enable-functionThis is like the :enable-function abbrev property except that
it applies to all abbrevs in the table. It is used before even trying
to find the abbrev before point, so it can dynamically modify the
abbrev table.
:case-fixedThis is like the :case-fixed abbrev property except that it
applies to all abbrevs in the table.
:regexpIf non-nil, this property is a regular expression that
indicates how to extract the name of the abbrev before point, before
looking it up in the table. When the regular expression matches
before point, the abbrev name is expected to be in submatch 1.
If this property is nil, the default is to use
backward-word and forward-word to find the name. This
property allows the use of abbrevs whose name contains characters of
non-word syntax.
:parentsThis property holds a list of tables from which to inherit other abbrevs.
:abbrev-table-modiffThis property holds a counter incremented each time a new abbrev is added to the table.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In the terminology of operating systems, a process is a space in which a program can execute. Emacs runs in a process. Emacs Lisp programs can invoke other programs in processes of their own. These are called subprocesses or child processes of the Emacs process, which is their parent process.
A subprocess of Emacs may be synchronous or asynchronous, depending on how it is created. When you create a synchronous subprocess, the Lisp program waits for the subprocess to terminate before continuing execution. When you create an asynchronous subprocess, it can run in parallel with the Lisp program. This kind of subprocess is represented within Emacs by a Lisp object which is also called a “process”. Lisp programs can use this object to communicate with the subprocess or to control it. For example, you can send signals, obtain status information, receive output from the process, or send input to it.
This function returns t if object represents an Emacs
subprocess, nil otherwise.
In addition to subprocesses of the current Emacs session, you can also access other processes running on your machine. See section Accessing Other Processes.
| 36.1 Functions that Create Subprocesses | Functions that start subprocesses. | |
| 36.2 Shell Arguments | Quoting an argument to pass it to a shell. | |
| 36.3 Creating a Synchronous Process | Details of using synchronous subprocesses. | |
| 36.4 Creating an Asynchronous Process | Starting up an asynchronous subprocess. | |
| 36.5 Deleting Processes | Eliminating an asynchronous subprocess. | |
| 36.6 Process Information | Accessing run-status and other attributes. | |
| 36.7 Sending Input to Processes | Sending input to an asynchronous subprocess. | |
| 36.8 Sending Signals to Processes | Stopping, continuing or interrupting an asynchronous subprocess. | |
| 36.9 Receiving Output from Processes | Collecting output from an asynchronous subprocess. | |
| 36.10 Sentinels: Detecting Process Status Changes | Sentinels run when process run-status changes. | |
| 36.11 Querying Before Exit | Whether to query if exiting will kill a process. | |
| 36.12 Accessing Other Processes | Accessing other processes running on your system. | |
| 36.13 Transaction Queues | Transaction-based communication with subprocesses. | |
| 36.14 Network Connections | Opening network connections. | |
| 36.15 Network Servers | Network servers let Emacs accept net connections. | |
| 36.16 Datagrams | UDP network connections. | |
| 36.17 Low-Level Network Access | Lower-level but more general function to create connections and servers. | |
| 36.18 Misc Network Facilities | Additional relevant functions for net connections. | |
| 36.19 Communicating with Serial Ports | Communicating with serial ports. | |
| 36.20 Packing and Unpacking Byte Arrays | Using bindat to pack and unpack binary data. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
There are three primitives that create a new subprocess in which to run
a program. One of them, start-process, creates an asynchronous
process and returns a process object (see section Creating an Asynchronous Process).
The other two, call-process and call-process-region,
create a synchronous process and do not return a process object
(see section Creating a Synchronous Process). There are various higher-level
functions that make use of these primitives to run particular types of
process.
Synchronous and asynchronous processes are explained in the following sections. Since the three functions are all called in a similar fashion, their common arguments are described here.
In all cases, the function’s program argument specifies the
program to be run. An error is signaled if the file is not found or
cannot be executed. If the file name is relative, the variable
exec-path contains a list of directories to search. Emacs
initializes exec-path when it starts up, based on the value of
the environment variable PATH. The standard file name
constructs, ‘~’, ‘.’, and ‘..’, are interpreted as
usual in exec-path, but environment variable substitutions
(‘$HOME’, etc.) are not recognized; use
substitute-in-file-name to perform them (see section Functions that Expand Filenames). nil in this list refers to
default-directory.
Executing a program can also try adding suffixes to the specified name:
This variable is a list of suffixes (strings) to try adding to the
specified program file name. The list should include "" if you
want the name to be tried exactly as specified. The default value is
system-dependent.
Please note: The argument program contains only the name of the program; it may not contain any command-line arguments. You must use a separate argument, args, to provide those, as described below.
Each of the subprocess-creating functions has a buffer-or-name
argument that specifies where the standard output from the program will
go. It should be a buffer or a buffer name; if it is a buffer name,
that will create the buffer if it does not already exist. It can also
be nil, which says to discard the output, unless a custom filter function
handles it. (See section Process Filter Functions, and Reading and Printing Lisp Objects.)
Normally, you should avoid having multiple processes send output to the
same buffer because their output would be intermixed randomly.
For synchronous processes, you can send the output to a file instead
of a buffer.
All three of the subprocess-creating functions have a &rest
argument, args. The args must all be strings, and they are
supplied to program as separate command line arguments. Wildcard
characters and other shell constructs have no special meanings in these
strings, since the strings are passed directly to the specified program.
The subprocess inherits its environment from Emacs, but you can
specify overrides for it with process-environment. See section Operating System Environment. The subprocess gets its current directory from the
value of default-directory.
The value of this variable is a string, the name of a directory that
contains programs that come with GNU Emacs and are intended for Emacs
to invoke. The program movemail is an example of such a program;
Rmail uses it to fetch new mail from an inbox.
The value of this variable is a list of directories to search for
programs to run in subprocesses. Each element is either the name of a
directory (i.e., a string), or nil, which stands for the default
directory (which is the value of default-directory).
The value of exec-path is used by call-process and
start-process when the program argument is not an absolute
file name.
Generally, you should not modify exec-path directly. Instead,
ensure that your PATH environment variable is set appropriately
before starting Emacs. Trying to modify exec-path
independently of PATH can lead to confusing results.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lisp programs sometimes need to run a shell and give it a command
that contains file names that were specified by the user. These
programs ought to be able to support any valid file name. But the shell
gives special treatment to certain characters, and if these characters
occur in the file name, they will confuse the shell. To handle these
characters, use the function shell-quote-argument:
This function returns a string that represents, in shell syntax, an argument whose actual contents are argument. It should work reliably to concatenate the return value into a shell command and then pass it to a shell for execution.
Precisely what this function does depends on your operating system. The function is designed to work with the syntax of your system’s standard shell; if you use an unusual shell, you will need to redefine this function.
;; This example shows the behavior on GNU and Unix systems. (shell-quote-argument "foo > bar") ⇒ "foo\\ \\>\\ bar" ;; This example shows the behavior on MS-DOS and MS-Windows. (shell-quote-argument "foo > bar") ⇒ "\"foo > bar\""
Here’s an example of using shell-quote-argument to construct
a shell command:
(concat "diff -c "
(shell-quote-argument oldfile)
" "
(shell-quote-argument newfile))
The following two functions are useful for combining a list of
individual command-line argument strings into a single string, and
taking a string apart into a list of individual command-line
arguments. These functions are mainly intended for
converting user input in the minibuffer, a Lisp string, into a list of
string arguments to be passed to call-process or
start-process, or for converting such lists of arguments into
a single Lisp string to be presented in the minibuffer or echo area.
This function splits string into substrings at matches for the
regular expression separators, like split-string does
(see section Creating Strings); in addition, it removes quoting from the
substrings. It then makes a list of the substrings and returns it.
If separators is omitted or nil, it defaults to
"\\s-+", which is a regular expression that matches one or more
characters with whitespace syntax (see section Table of Syntax Classes).
This function supports two types of quoting: enclosing a whole string
in double quotes "…", and quoting individual characters
with a backslash escape ‘\’. The latter is also used in Lisp
strings, so this function can handle those as well.
This function concatenates list-of-strings into a single string,
quoting each string as necessary. It also sticks the separator
string between each pair of strings; if separator is omitted or
nil, it defaults to " ". The return value is the
resulting string.
The strings in list-of-strings that need quoting are those that
include separator as their substring. Quoting a string encloses
it in double quotes "…". In the simplest case, if you
are consing a command from the individual command-line arguments,
every argument that includes embedded blanks will be quoted.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
After a synchronous process is created, Emacs waits for the
process to terminate before continuing. Starting Dired on GNU or
Unix18 is an example of this: it
runs ls in a synchronous process, then modifies the output
slightly. Because the process is synchronous, the entire directory
listing arrives in the buffer before Emacs tries to do anything with it.
While Emacs waits for the synchronous subprocess to terminate, the
user can quit by typing C-g. The first C-g tries to kill
the subprocess with a SIGINT signal; but it waits until the
subprocess actually terminates before quitting. If during that time the
user types another C-g, that kills the subprocess instantly with
SIGKILL and quits immediately (except on MS-DOS, where killing
other processes doesn’t work). See section Quitting.
The synchronous subprocess functions return an indication of how the process terminated.
The output from a synchronous subprocess is generally decoded using a
coding system, much like text read from a file. The input sent to a
subprocess by call-process-region is encoded using a coding
system, much like text written into a file. See section Coding Systems.
This function calls program and waits for it to finish.
The current working directory of the subprocess is
default-directory.
The standard input for the new process comes from file infile if
infile is not nil, and from the null device otherwise.
The argument destination says where to put the process output.
Here are the possibilities:
Insert the output in that buffer, before point. This includes both the standard output stream and the standard error stream of the process.
Insert the output in a buffer with that name, before point.
tInsert the output in the current buffer, before point.
nilDiscard the output.
Discard the output, and return nil immediately without waiting
for the subprocess to finish.
In this case, the process is not truly synchronous, since it can run in parallel with Emacs; but you can think of it as synchronous in that Emacs is essentially finished with the subprocess as soon as this function returns.
MS-DOS doesn’t support asynchronous subprocesses, so this option doesn’t work there.
(:file file-name)Send the output to the file name specified, overwriting it if it already exists.
(real-destination error-destination)Keep the standard output stream separate from the standard error stream;
deal with the ordinary output as specified by real-destination,
and dispose of the error output according to error-destination.
If error-destination is nil, that means to discard the
error output, t means mix it with the ordinary output, and a
string specifies a file name to redirect error output into.
You can’t directly specify a buffer to put the error output in; that is too difficult to implement. But you can achieve this result by sending the error output to a temporary file and then inserting the file into a buffer.
If display is non-nil, then call-process redisplays
the buffer as output is inserted. (However, if the coding system chosen
for decoding output is undecided, meaning deduce the encoding
from the actual data, then redisplay sometimes cannot continue once
non-ASCII characters are encountered. There are fundamental
reasons why it is hard to fix this; see Receiving Output from Processes.)
Otherwise the function call-process does no redisplay, and the
results become visible on the screen only when Emacs redisplays that
buffer in the normal course of events.
The remaining arguments, args, are strings that specify command line arguments for the program.
The value returned by call-process (unless you told it not to
wait) indicates the reason for process termination. A number gives the
exit status of the subprocess; 0 means success, and any other value
means failure. If the process terminated with a signal,
call-process returns a string describing the signal.
In the examples below, the buffer ‘foo’ is current.
(call-process "pwd" nil t)
⇒ 0
---------- Buffer: foo ----------
/home/lewis/manual
---------- Buffer: foo ----------
(call-process "grep" nil "bar" nil "lewis" "/etc/passwd")
⇒ 0
---------- Buffer: bar ----------
lewis:x:1001:1001:Bil Lewis,,,,:/home/lewis:/bin/bash
---------- Buffer: bar ----------
Here is an example of the use of call-process, as used to
be found in the definition of the insert-directory function:
(call-process insert-directory-program nil t nil switches
(if full-directory-p
(concat (file-name-as-directory file) ".")
file))
This function processes files synchronously in a separate process. It
is similar to call-process, but may invoke a file handler based
on the value of the variable default-directory, which specifies
the current working directory of the subprocess.
The arguments are handled in almost the same way as for
call-process, with the following differences:
Some file handlers may not support all combinations and forms of the
arguments infile, buffer, and display. For example,
some file handlers might behave as if display were nil,
regardless of the value actually passed. As another example, some
file handlers might not support separating standard output and error
output by way of the buffer argument.
If a file handler is invoked, it determines the program to run based
on the first argument program. For instance, suppose that a
handler for remote files is invoked. Then the path that is used for
searching for the program might be different from exec-path.
The second argument infile may invoke a file handler. The file
handler could be different from the handler chosen for the
process-file function itself. (For example,
default-directory could be on one remote host, and
infile on a different remote host. Or default-directory
could be non-special, whereas infile is on a remote host.)
If buffer is a list of the form (real-destination
error-destination), and error-destination names a file,
then the same remarks as for infile apply.
The remaining arguments (args) will be passed to the process
verbatim. Emacs is not involved in processing file names that are
present in args. To avoid confusion, it may be best to avoid
absolute file names in args, but rather to specify all file
names as relative to default-directory. The function
file-relative-name is useful for constructing such relative
file names.
This variable indicates whether a call of process-file changes
remote files.
By default, this variable is always set to t, meaning that a
call of process-file could potentially change any file on a
remote host. When set to nil, a file handler could optimize
its behavior with respect to remote file attribute caching.
You should only ever change this variable with a let-binding; never
with setq.
This function sends the text from start to end as
standard input to a process running program. It deletes the text
sent if delete is non-nil; this is useful when
destination is t, to insert the output in the current
buffer in place of the input.
The arguments destination and display control what to do
with the output from the subprocess, and whether to update the display
as it comes in. For details, see the description of
call-process, above. If destination is the integer 0,
call-process-region discards the output and returns nil
immediately, without waiting for the subprocess to finish (this only
works if asynchronous subprocesses are supported; i.e., not on MS-DOS).
The remaining arguments, args, are strings that specify command line arguments for the program.
The return value of call-process-region is just like that of
call-process: nil if you told it to return without
waiting; otherwise, a number or string which indicates how the
subprocess terminated.
In the following example, we use call-process-region to run the
cat utility, with standard input being the first five characters
in buffer ‘foo’ (the word ‘input’). cat copies its
standard input into its standard output. Since the argument
destination is t, this output is inserted in the current
buffer.
---------- Buffer: foo ---------- input∗ ---------- Buffer: foo ----------
(call-process-region 1 6 "cat" nil t)
⇒ 0
---------- Buffer: foo ----------
inputinput∗
---------- Buffer: foo ----------
For example, the shell-command-on-region command uses
call-process-region in a manner similar to this:
(call-process-region
start end
shell-file-name ; name of program
nil ; do not delete region
buffer ; send output to buffer
nil ; no redisplay during output
"-c" command) ; arguments for the shell
This function executes the shell command command synchronously.
The arguments are handled as in call-process. An old calling
convention allowed to pass any number of additional arguments after
display, which were concatenated to command; this is still
supported, but strongly discouraged.
This function is like call-process-shell-command, but uses
process-file internally. Depending on default-directory,
command can be executed also on remote hosts. An old calling
convention allowed to pass any number of additional arguments after
display, which were concatenated to command; this is still
supported, but strongly discouraged.
This function executes command (a string) as a shell command, then returns the command’s output as a string.
This function runs program, waits for it to finish, and returns its output as a list of strings. Each string in the list holds a single line of text output by the program; the end-of-line characters are stripped from each line. The arguments beyond program, args, are strings that specify command-line arguments with which to run the program.
If program exits with a non-zero exit status, this function signals an error.
This function works by calling call-process, so program output
is decoded in the same way as for call-process.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In this section, we describe how to create an asynchronous process. After an asynchronous process is created, it runs in parallel with Emacs, and Emacs can communicate with it using the functions described in the following sections (see section Sending Input to Processes, and see section Receiving Output from Processes). Note that process communication is only partially asynchronous: Emacs sends data to the process only when certain functions are called, and Emacs accepts data from the process only while waiting for input or for a time delay.
An asynchronous process is controlled either via a pty
(pseudo-terminal) or a pipe. The choice of pty or pipe is made
when creating the process, based on the value of the variable
process-connection-type (see below). Ptys are usually
preferable for processes visible to the user, as in Shell mode,
because they allow for job control (C-c, C-z, etc.)
between the process and its children, whereas pipes do not. For
subprocesses used for internal purposes by programs, it is often
better to use a pipe, because they are more efficient, and because
they are immune to stray character injections that ptys introduce for
large (around 500 byte) messages. Also, the total number of ptys is
limited on many systems and it is good not to waste them.
This function creates a new asynchronous subprocess and starts the program program running in it. It returns a process object that stands for the new subprocess in Lisp. The argument name specifies the name for the process object; if a process with this name already exists, then name is modified (by appending ‘<1>’, etc.) to be unique. The buffer buffer-or-name is the buffer to associate with the process.
If program is nil, Emacs opens a new pseudoterminal (pty)
and associates its input and output with buffer-or-name, without
creating a subprocess. In that case, the remaining arguments
args are ignored.
The remaining arguments, args, are strings that specify command line arguments for the subprocess.
In the example below, the first process is started and runs (rather, sleeps) for 100 seconds (the output buffer ‘foo’ is created immediately). Meanwhile, the second process is started, and given the name ‘my-process<1>’ for the sake of uniqueness. It inserts the directory listing at the end of the buffer ‘foo’, before the first process finishes. Then it finishes, and a message to that effect is inserted in the buffer. Much later, the first process finishes, and another message is inserted in the buffer for it.
(start-process "my-process" "foo" "sleep" "100")
⇒ #<process my-process>
(start-process "my-process" "foo" "ls" "-l" "/bin")
⇒ #<process my-process<1>>
---------- Buffer: foo ----------
total 8336
-rwxr-xr-x 1 root root 971384 Mar 30 10:14 bash
-rwxr-xr-x 1 root root 146920 Jul 5 2011 bsd-csh
…
-rwxr-xr-x 1 root root 696880 Feb 28 15:55 zsh4
Process my-process<1> finished
Process my-process finished
---------- Buffer: foo ----------
Like start-process, this function starts a new asynchronous
subprocess running program in it, and returns its process
object.
The difference from start-process is that this function may
invoked a file handler based on the value of default-directory.
This handler ought to run program, perhaps on the local host,
perhaps on a remote host that corresponds to default-directory.
In the latter case, the local part of default-directory becomes
the working directory of the process.
This function does not try to invoke file name handlers for program or for the program-args.
Depending on the implementation of the file handler, it might not be
possible to apply process-filter or process-sentinel to
the resulting process object. See section Process Filter Functions, and Sentinels: Detecting Process Status Changes.
Some file handlers may not support start-file-process (for
example the function ange-ftp-hook-function). In such cases,
this function does nothing and returns nil.
This function is like start-process, except that it uses a shell
to execute the specified command. The argument command is a shell
command name. The variable shell-file-name specifies which shell to
use.
The point of running a program through the shell, rather than directly
with start-process, is so that you can employ shell features such
as wildcards in the arguments. It follows that if you include any
arbitrary user-specified arguments in the command, you should quote them
with shell-quote-argument first, so that any special shell
characters do not have their special shell meanings. See section Shell Arguments. Of course, when executing commands based on user input
you should also consider the security implications.
This function is like start-process-shell-command, but uses
start-file-process internally. Because of this, command
can also be executed on remote hosts, depending on default-directory.
This variable controls the type of device used to communicate with
asynchronous subprocesses. If it is non-nil, then ptys are
used, when available. Otherwise, pipes are used.
The value of process-connection-type takes effect when
start-process is called. So you can specify how to communicate
with one subprocess by binding the variable around the call to
start-process.
(let ((process-connection-type nil)) ; use a pipe
(start-process …))
To determine whether a given subprocess actually got a pipe or a pty,
use the function process-tty-name (see section Process Information).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Deleting a process disconnects Emacs immediately from the subprocess. Processes are deleted automatically after they terminate, but not necessarily right away. You can delete a process explicitly at any time. If you explicitly delete a terminated process before it is deleted automatically, no harm results. Deleting a running process sends a signal to terminate it (and its child processes, if any), and calls the process sentinel. See section Sentinels: Detecting Process Status Changes.
When a process is deleted, the process object itself continues to exist as long as other Lisp objects point to it. All the Lisp primitives that work on process objects accept deleted processes, but those that do I/O or send signals will report an error. The process mark continues to point to the same place as before, usually into a buffer where output from the process was being inserted.
This variable controls automatic deletion of processes that have
terminated (due to calling exit or to a signal). If it is
nil, then they continue to exist until the user runs
list-processes. Otherwise, they are deleted immediately after
they exit.
This function deletes a process, killing it with a SIGKILL
signal. The argument may be a process, the name of a process, a
buffer, or the name of a buffer. (A buffer or buffer-name stands for
the process that get-buffer-process returns.) Calling
delete-process on a running process terminates it, updates the
process status, and runs the sentinel immediately. If the
process has already terminated, calling delete-process has no
effect on its status, or on the running of its sentinel (which will
happen sooner or later).
(delete-process "*shell*")
⇒ nil
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Several functions return information about processes.
This command displays a listing of all living processes. In addition,
it finally deletes any process whose status was ‘Exited’ or
‘Signaled’. It returns nil.
The processes are shown in a buffer named *Process List* (unless you specify otherwise using the optional argument buffer), whose major mode is Process Menu mode.
If query-only is non-nil, it only lists processes
whose query flag is non-nil. See section Querying Before Exit.
This function returns a list of all processes that have not been deleted.
(process-list)
⇒ (#<process display-time> #<process shell>)
This function returns the process named name (a string), or
nil if there is none.
(get-process "shell")
⇒ #<process shell>
This function returns the command that was executed to start process. This is a list of strings, the first string being the program executed and the rest of the strings being the arguments that were given to the program.
(process-command (get-process "shell"))
⇒ ("bash" "-i")
This function returns information about how a network or serial
process was set up. When key is nil, it returns
(hostname service) for a network process, and
(port speed) for a serial process.
For an ordinary child process, this function always returns t.
If key is t, the value is the complete status information
for the connection, server, or serial port; that is, the list of
keywords and values specified in make-network-process or
make-serial-process, except that some of the values represent
the current status instead of what you specified.
For a network process, the values include (see
make-network-process for a complete list):
:bufferThe associated value is the process buffer.
:filterThe associated value is the process filter function.
:sentinelThe associated value is the process sentinel function.
:remoteIn a connection, the address in internal format of the remote peer.
:localThe local address, in internal format.
:serviceIn a server, if you specified t for service,
this value is the actual port number.
:local and :remote are included even if they were not
specified explicitly in make-network-process.
For a serial process, see make-serial-process and
serial-process-configure for a list of keys.
If key is a keyword, the function returns the value corresponding to that keyword.
This function returns the PID of process. This is an integer that distinguishes the process process from all other processes running on the same computer at the current time. The PID of a process is chosen by the operating system kernel when the process is started and remains constant as long as the process exists.
This function returns the name of process, as a string.
This function returns the status of process-name as a symbol. The argument process-name must be a process, a buffer, or a process name (a string).
The possible values for an actual subprocess are:
runfor a process that is running.
stopfor a process that is stopped but continuable.
exitfor a process that has exited.
signalfor a process that has received a fatal signal.
openfor a network connection that is open.
closedfor a network connection that is closed. Once a connection is closed, you cannot reopen it, though you might be able to open a new connection to the same place.
connectfor a non-blocking connection that is waiting to complete.
failedfor a non-blocking connection that has failed to complete.
listenfor a network server that is listening.
nilif process-name is not the name of an existing process.
(process-status (get-buffer "*shell*"))
⇒ run
For a network connection, process-status returns one of the symbols
open or closed. The latter means that the other side
closed the connection, or Emacs did delete-process.
This function returns non-nil if process is alive. A
process is considered alive if its status is run, open,
listen, connect or stop.
This function returns the symbol network for a network
connection or server, serial for a serial port connection, or
real for a real subprocess.
This function returns the exit status of process or the signal
number that killed it. (Use the result of process-status to
determine which of those it is.) If process has not yet
terminated, the value is 0.
This function returns the terminal name that process is using for
its communication with Emacs—or nil if it is using pipes
instead of a terminal (see process-connection-type in
Creating an Asynchronous Process). If process represents a program
running on a remote host, the terminal name used by that program on
the remote host is provided as process property remote-tty.
This function returns a cons cell (decode . encode),
describing the coding systems in use for decoding output from, and
encoding input to, process (see section Coding Systems).
This function specifies the coding systems to use for subsequent output from and input to process. It will use decoding-system to decode subprocess output, and encoding-system to encode subprocess input.
Every process also has a property list that you can use to store miscellaneous values associated with the process.
This function returns the value of the propname property of process.
This function sets the value of the propname property of process to value.
This function returns the process plist of process.
This function sets the process plist of process to plist.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Asynchronous subprocesses receive input when it is sent to them by Emacs, which is done with the functions in this section. You must specify the process to send input to, and the input data to send. The data appears on the “standard input” of the subprocess.
Some operating systems have limited space for buffered input in a pty. On these systems, Emacs sends an EOF periodically amidst the other characters, to force them through. For most programs, these EOFs do no harm.
Subprocess input is normally encoded using a coding system before the
subprocess receives it, much like text written into a file. You can use
set-process-coding-system to specify which coding system to use
(see section Process Information). Otherwise, the coding system comes from
coding-system-for-write, if that is non-nil; or else from
the defaulting mechanism (see section Default Coding Systems).
Sometimes the system is unable to accept input for that process, because the input buffer is full. When this happens, the send functions wait a short while, accepting output from subprocesses, and then try again. This gives the subprocess a chance to read more of its pending input and make space in the buffer. It also allows filters, sentinels and timers to run—so take account of that in writing your code.
In these functions, the process argument can be a process or
the name of a process, or a buffer or buffer name (which stands
for a process via get-buffer-process). nil means
the current buffer’s process.
This function sends process the contents of string as
standard input. It returns nil. For example, to make a
Shell buffer list files:
(process-send-string "shell<1>" "ls\n")
⇒ nil
This function sends the text in the region defined by start and end as standard input to process.
An error is signaled unless both start and end are integers or markers that indicate positions in the current buffer. (It is unimportant which number is larger.)
This function makes process see an end-of-file in its input. The EOF comes after any text already sent to it. The function returns process.
(process-send-eof "shell")
⇒ "shell"
This function will tell you whether a process has given control of
its terminal to its own child process. The value is t if this is
true, or if Emacs cannot tell; it is nil if Emacs can be certain
that this is not so.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Sending a signal to a subprocess is a way of interrupting its
activities. There are several different signals, each with its own
meaning. The set of signals and their names is defined by the operating
system. For example, the signal SIGINT means that the user has
typed C-c, or that some analogous thing has happened.
Each signal has a standard effect on the subprocess. Most signals kill the subprocess, but some stop (or resume) execution instead. Most signals can optionally be handled by programs; if the program handles the signal, then we can say nothing in general about its effects.
You can send signals explicitly by calling the functions in this
section. Emacs also sends signals automatically at certain times:
killing a buffer sends a SIGHUP signal to all its associated
processes; killing Emacs sends a SIGHUP signal to all remaining
processes. (SIGHUP is a signal that usually indicates that the
user “hung up the phone”, i.e., disconnected.)
Each of the signal-sending functions takes two optional arguments: process and current-group.
The argument process must be either a process, a process
name, a buffer, a buffer name, or nil. A buffer or buffer name
stands for a process through get-buffer-process. nil
stands for the process associated with the current buffer. An error
is signaled if process does not identify a process.
The argument current-group is a flag that makes a difference
when you are running a job-control shell as an Emacs subprocess. If it
is non-nil, then the signal is sent to the current process-group
of the terminal that Emacs uses to communicate with the subprocess. If
the process is a job-control shell, this means the shell’s current
subjob. If it is nil, the signal is sent to the process group of
the immediate subprocess of Emacs. If the subprocess is a job-control
shell, this is the shell itself.
The flag current-group has no effect when a pipe is used to
communicate with the subprocess, because the operating system does not
support the distinction in the case of pipes. For the same reason,
job-control shells won’t work when a pipe is used. See
process-connection-type in Creating an Asynchronous Process.
This function interrupts the process process by sending the
signal SIGINT. Outside of Emacs, typing the “interrupt
character” (normally C-c on some systems, and DEL on
others) sends this signal. When the argument current-group is
non-nil, you can think of this function as “typing C-c”
on the terminal by which Emacs talks to the subprocess.
This function kills the process process by sending the
signal SIGKILL. This signal kills the subprocess immediately,
and cannot be handled by the subprocess.
This function sends the signal SIGQUIT to the process
process. This signal is the one sent by the “quit
character” (usually C-b or C-\) when you are not inside
Emacs.
This function stops the process process by sending the
signal SIGTSTP. Use continue-process to resume its
execution.
Outside of Emacs, on systems with job control, the “stop character”
(usually C-z) normally sends this signal. When
current-group is non-nil, you can think of this function as
“typing C-z” on the terminal Emacs uses to communicate with the
subprocess.
This function resumes execution of the process process by sending
it the signal SIGCONT. This presumes that process was
stopped previously.
This function sends a signal to process process. The argument signal specifies which signal to send; it should be an integer, or a symbol whose name is a signal.
The process argument can be a system process ID (an integer); that allows you to send signals to processes that are not children of Emacs. See section Accessing Other Processes.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The output that a subprocess writes to its standard output stream is passed to a function called the filter function. The default filter function simply inserts the output into a buffer, which is called the associated buffer of the process (see section Process Buffers). If the process has no buffer then the default filter discards the output.
When a subprocess terminates, Emacs reads any pending output, then stops reading output from that subprocess. Therefore, if the subprocess has children that are still live and still producing output, Emacs won’t receive that output.
Output from a subprocess can arrive only while Emacs is waiting: when
reading terminal input (see the function waiting-for-user-input-p),
in sit-for and sleep-for (see section Waiting for Elapsed Time or Input), and in
accept-process-output (see section Accepting Output from Processes). This
minimizes the problem of timing errors that usually plague parallel
programming. For example, you can safely create a process and only
then specify its buffer or filter function; no output can arrive
before you finish, if the code in between does not call any primitive
that waits.
On some systems, when Emacs reads the output from a subprocess, the
output data is read in very small blocks, potentially resulting in
very poor performance. This behavior can be remedied to some extent
by setting the variable process-adaptive-read-buffering to a
non-nil value (the default), as it will automatically delay reading
from such processes, thus allowing them to produce more output before
Emacs tries to read it.
It is impossible to separate the standard output and standard error streams of the subprocess, because Emacs normally spawns the subprocess inside a pseudo-TTY, and a pseudo-TTY has only one output channel. If you want to keep the output to those streams separate, you should redirect one of them to a file—for example, by using an appropriate shell command.
| 36.9.1 Process Buffers | By default, output is put in a buffer. | |
| 36.9.2 Process Filter Functions | Filter functions accept output from the process. | |
| 36.9.3 Decoding Process Output | Filters can get unibyte or multibyte strings. | |
| 36.9.4 Accepting Output from Processes | How to wait until process output arrives. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A process can (and usually does) have an associated buffer, which is an ordinary Emacs buffer that is used for two purposes: storing the output from the process, and deciding when to kill the process. You can also use the buffer to identify a process to operate on, since in normal practice only one process is associated with any given buffer. Many applications of processes also use the buffer for editing input to be sent to the process, but this is not built into Emacs Lisp.
By default, process output is inserted in the associated buffer.
(You can change this by defining a custom filter function,
see section Process Filter Functions.) The position to insert the output is
determined by the process-mark, which is then updated to point
to the end of the text just inserted. Usually, but not always, the
process-mark is at the end of the buffer.
Killing the associated buffer of a process also kills the process.
Emacs asks for confirmation first, if the process’s
process-query-on-exit-flag is non-nil (see section Querying Before Exit). This confirmation is done by the function
process-kill-buffer-query-function, which is run from
kill-buffer-query-functions (see section Killing Buffers).
This function returns the associated buffer of the process process.
(process-buffer (get-process "shell"))
⇒ #<buffer *shell*>
This function returns the process marker for process, which is the marker that says where to insert output from the process.
If process does not have a buffer, process-mark returns a
marker that points nowhere.
The default filter function uses this marker to decide where to insert process output, and updates it to point after the inserted text. That is why successive batches of output are inserted consecutively.
Custom filter functions normally should use this marker in the same fashion.
For an example of a filter function that uses process-mark,
see Process Filter Example.
When the user is expected to enter input in the process buffer for transmission to the process, the process marker separates the new input from previous output.
This function sets the buffer associated with process to
buffer. If buffer is nil, the process becomes
associated with no buffer.
This function returns a nondeleted process associated with the buffer
specified by buffer-or-name. If there are several processes
associated with it, this function chooses one (currently, the one most
recently created, but don’t count on that). Deletion of a process
(see delete-process) makes it ineligible for this function to
return.
It is usually a bad idea to have more than one process associated with the same buffer.
(get-buffer-process "*shell*")
⇒ #<process shell>
Killing the process’s buffer deletes the process, which kills the
subprocess with a SIGHUP signal (see section Sending Signals to Processes).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A process filter function is a function that receives the standard output from the associated process. All output from that process is passed to the filter. The default filter simply outputs directly to the process buffer.
The filter function can only be called when Emacs is waiting for
something, because process output arrives only at such times. Emacs
waits when reading terminal input (see the function
waiting-for-user-input-p), in sit-for and
sleep-for (see section Waiting for Elapsed Time or Input), and in
accept-process-output (see section Accepting Output from Processes).
A filter function must accept two arguments: the associated process and a string, which is output just received from it. The function is then free to do whatever it chooses with the output.
Quitting is normally inhibited within a filter function—otherwise,
the effect of typing C-g at command level or to quit a user
command would be unpredictable. If you want to permit quitting inside
a filter function, bind inhibit-quit to nil. In most
cases, the right way to do this is with the macro
with-local-quit. See section Quitting.
If an error happens during execution of a filter function, it is
caught automatically, so that it doesn’t stop the execution of whatever
program was running when the filter function was started. However, if
debug-on-error is non-nil, errors are not caught.
This makes it possible to use the Lisp debugger to debug the
filter function. See section The Lisp Debugger.
Many filter functions sometimes (or always) insert the output in the process’s buffer, mimicking the actions of the default filter. Such filter functions need to make sure that they save the current buffer, select the correct buffer (if different) before inserting output, and then restore the original buffer. They should also check whether the buffer is still alive, update the process marker, and in some cases update the value of point. Here is how to do these things:
(defun ordinary-insertion-filter (proc string)
(when (buffer-live-p (process-buffer proc))
(with-current-buffer (process-buffer proc)
(let ((moving (= (point) (process-mark proc))))
(save-excursion
;; Insert the text, advancing the process marker.
(goto-char (process-mark proc))
(insert string)
(set-marker (process-mark proc) (point)))
(if moving (goto-char (process-mark proc)))))))
To make the filter force the process buffer to be visible whenever new
text arrives, you could insert a line like the following just before the
with-current-buffer construct:
(display-buffer (process-buffer proc))
To force point to the end of the new output, no matter where it was
previously, eliminate the variable moving and call
goto-char unconditionally.
Note that Emacs automatically saves and restores the match data while executing filter functions. See section The Match Data.
The output to the filter may come in chunks of any size. A program that produces the same output twice in a row may send it as one batch of 200 characters one time, and five batches of 40 characters the next. If the filter looks for certain text strings in the subprocess output, make sure to handle the case where one of these strings is split across two or more batches of output; one way to do this is to insert the received text into a temporary buffer, which can then be searched.
This function gives process the filter function filter. If
filter is nil, it gives the process the default filter,
which inserts the process output into the process buffer.
This function returns the filter function of process.
In case the process’s output needs to be passed to several filters, you can
use add-function to combine an existing filter with a new one.
See section Advising Emacs Lisp Functions.
Here is an example of the use of a filter function:
(defun keep-output (process output)
(setq kept (cons output kept)))
⇒ keep-output
(setq kept nil)
⇒ nil
(set-process-filter (get-process "shell") 'keep-output)
⇒ keep-output
(process-send-string "shell" "ls ~/other\n")
⇒ nil
kept
⇒ ("lewis@slug:$ "
"FINAL-W87-SHORT.MSS backup.otl kolstad.mss~ address.txt backup.psf kolstad.psf backup.bib~ david.mss resume-Dec-86.mss~ backup.err david.psf resume-Dec.psf backup.mss dland syllabus.mss " "#backups.mss# backup.mss~ kolstad.mss ")
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When Emacs writes process output directly into a multibyte buffer,
it decodes the output according to the process output coding system.
If the coding system is raw-text or no-conversion, Emacs
converts the unibyte output to multibyte using
string-to-multibyte, and inserts the resulting multibyte text.
You can use set-process-coding-system to specify which coding
system to use (see section Process Information). Otherwise, the coding
system comes from coding-system-for-read, if that is
non-nil; or else from the defaulting mechanism (see section Default Coding Systems). If the text output by a process contains null
bytes, Emacs by default uses no-conversion for it; see
inhibit-null-byte-detection, for how to
control this behavior.
Warning: Coding systems such as undecided, which
determine the coding system from the data, do not work entirely
reliably with asynchronous subprocess output. This is because Emacs
has to process asynchronous subprocess output in batches, as it
arrives. Emacs must try to detect the proper coding system from one
batch at a time, and this does not always work. Therefore, if at all
possible, specify a coding system that determines both the character
code conversion and the end of line conversion—that is, one like
latin-1-unix, rather than undecided or latin-1.
When Emacs calls a process filter function, it provides the process
output as a multibyte string or as a unibyte string according to the
process’s filter coding system. Emacs
decodes the output according to the process output coding system,
which usually produces a multibyte string, except for coding systems
such as binary and raw-text.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Output from asynchronous subprocesses normally arrives only while Emacs is waiting for some sort of external event, such as elapsed time or terminal input. Occasionally it is useful in a Lisp program to explicitly permit output to arrive at a specific point, or even to wait until output arrives from a process.
This function allows Emacs to read pending output from processes. The
output is given to their filter functions. If process is
non-nil then this function does not return until some output
has been received from process.
The arguments seconds and millisec let you specify timeout
periods. The former specifies a period measured in seconds and the
latter specifies one measured in milliseconds. The two time periods
thus specified are added together, and accept-process-output
returns after that much time, whether or not there has been any
subprocess output.
The argument millisec is obsolete (and should not be used), because seconds can be floating point to specify waiting a fractional number of seconds. If seconds is 0, the function accepts whatever output is pending but does not wait.
If process is a process, and the argument just-this-one is
non-nil, only output from that process is handled, suspending output
from other processes until some output has been received from that
process or the timeout expires. If just-this-one is an integer,
also inhibit running timers. This feature is generally not
recommended, but may be necessary for specific applications, such as
speech synthesis.
The function accept-process-output returns non-nil if it
did get some output, or nil if the timeout expired before output
arrived.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A process sentinel is a function that is called whenever the associated process changes status for any reason, including signals (whether sent by Emacs or caused by the process’s own actions) that terminate, stop, or continue the process. The process sentinel is also called if the process exits. The sentinel receives two arguments: the process for which the event occurred, and a string describing the type of event.
The string describing the event looks like one of the following:
"finished\n".
"exited abnormally with code exitcode\n".
"name-of-signal\n".
"name-of-signal (core dumped)\n".
A sentinel runs only while Emacs is waiting (e.g., for terminal
input, or for time to elapse, or for process output). This avoids the
timing errors that could result from running sentinels at random places in
the middle of other Lisp programs. A program can wait, so that
sentinels will run, by calling sit-for or sleep-for
(see section Waiting for Elapsed Time or Input), or accept-process-output (see section Accepting Output from Processes). Emacs also allows sentinels to run when the command loop is
reading input. delete-process calls the sentinel when it
terminates a running process.
Emacs does not keep a queue of multiple reasons to call the sentinel of one process; it records just the current status and the fact that there has been a change. Therefore two changes in status, coming in quick succession, can call the sentinel just once. However, process termination will always run the sentinel exactly once. This is because the process status can’t change again after termination.
Emacs explicitly checks for output from the process before running the process sentinel. Once the sentinel runs due to process termination, no further output can arrive from the process.
A sentinel that writes the output into the buffer of the process
should check whether the buffer is still alive. If it tries to insert
into a dead buffer, it will get an error. If the buffer is dead,
(buffer-name (process-buffer process)) returns nil.
Quitting is normally inhibited within a sentinel—otherwise, the
effect of typing C-g at command level or to quit a user command
would be unpredictable. If you want to permit quitting inside a
sentinel, bind inhibit-quit to nil. In most cases, the
right way to do this is with the macro with-local-quit.
See section Quitting.
If an error happens during execution of a sentinel, it is caught
automatically, so that it doesn’t stop the execution of whatever
programs was running when the sentinel was started. However, if
debug-on-error is non-nil, errors are not caught.
This makes it possible to use the Lisp debugger to debug the
sentinel. See section The Lisp Debugger.
While a sentinel is running, the process sentinel is temporarily
set to nil so that the sentinel won’t run recursively.
For this reason it is not possible for a sentinel to specify
a new sentinel.
Note that Emacs automatically saves and restores the match data while executing sentinels. See section The Match Data.
This function associates sentinel with process. If
sentinel is nil, then the process will have the default
sentinel, which inserts a message in the process’s buffer when the
process status changes.
Changes in process sentinels take effect immediately—if the sentinel is slated to be run but has not been called yet, and you specify a new sentinel, the eventual call to the sentinel will use the new one.
(defun msg-me (process event)
(princ
(format "Process: %s had the event `%s'" process event)))
(set-process-sentinel (get-process "shell") 'msg-me)
⇒ msg-me
(kill-process (get-process "shell"))
-| Process: #<process shell> had the event `killed'
⇒ #<process shell>
This function returns the sentinel of process.
In case a process status changes need to be passed to several sentinels, you
can use add-function to combine an existing sentinel with a new one.
See section Advising Emacs Lisp Functions.
While a sentinel or filter function is running, this function returns
non-nil if Emacs was waiting for keyboard input from the user at
the time the sentinel or filter function was called, or nil if it
was not.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When Emacs exits, it terminates all its subprocesses by sending them
the SIGHUP signal. Because subprocesses may be doing
valuable work, Emacs normally asks the user to confirm that it is ok
to terminate them. Each process has a query flag, which, if
non-nil, says that Emacs should ask for confirmation before
exiting and thus killing that process. The default for the query flag
is t, meaning do query.
This returns the query flag of process.
This function sets the query flag of process to flag. It returns flag.
Here is an example of using set-process-query-on-exit-flag on a
shell process to avoid querying:
(set-process-query-on-exit-flag (get-process "shell") nil)
⇒ nil
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In addition to accessing and manipulating processes that are subprocesses of the current Emacs session, Emacs Lisp programs can also access other processes running on the same machine. We call these system processes, to distinguish them from Emacs subprocesses.
Emacs provides several primitives for accessing system processes.
Not all platforms support these primitives; on those which don’t,
these primitives return nil.
This function returns a list of all the processes running on the system. Each process is identified by its PID, a numerical process ID that is assigned by the OS and distinguishes the process from all the other processes running on the same machine at the same time.
This function returns an alist of attributes for the process specified
by its process ID pid. Each association in the alist is of the
form (key . value), where key designates the
attribute and value is the value of that attribute. The various
attribute keys that this function can return are listed below.
Not all platforms support all of these attributes; if an attribute is
not supported, its association will not appear in the returned alist.
Values that are numbers can be either integer or floating point,
depending on the magnitude of the value.
euidThe effective user ID of the user who invoked the process. The
corresponding value is a number. If the process was invoked by
the same user who runs the current Emacs session, the value is
identical to what user-uid returns (see section User Identification).
userUser name corresponding to the process’s effective user ID, a string.
egidThe group ID of the effective user ID, a number.
groupGroup name corresponding to the effective user’s group ID, a string.
commThe name of the command that runs in the process. This is a string that usually specifies the name of the executable file of the process, without the leading directories. However, some special system processes can report strings that do not correspond to an executable file of a program.
stateThe state code of the process. This is a short string that encodes the scheduling state of the process. Here’s a list of the most frequently seen codes:
"D"uninterruptible sleep (usually I/O)
"R"running
"S"interruptible sleep (waiting for some event)
"T"stopped, e.g., by a job control signal
"Z"“zombie”: a process that terminated, but was not reaped by its parent
For the full list of the possible states, see the manual page of the
ps command.
ppidThe process ID of the parent process, a number.
pgrpThe process group ID of the process, a number.
sessThe session ID of the process. This is a number that is the process ID of the process’s session leader.
ttnameA string that is the name of the process’s controlling terminal. On Unix and GNU systems, this is normally the file name of the corresponding terminal device, such as /dev/pts65.
tpgidThe numerical process group ID of the foreground process group that uses the process’s terminal.
minfltThe number of minor page faults caused by the process since its beginning. (Minor page faults are those that don’t involve reading from disk.)
majfltThe number of major page faults caused by the process since its beginning. (Major page faults require a disk to be read, and are thus more expensive than minor page faults.)
cminfltcmajfltLike minflt and majflt, but include the number of page
faults for all the child processes of the given process.
utimeTime spent by the process in the user context, for running the
application’s code. The corresponding value is in the
(high low microsec picosec) format, the same
format used by functions current-time (see section current-time) and file-attributes (see section File Attributes).
stimeTime spent by the process in the system (kernel) context, for
processing system calls. The corresponding value is in the same
format as for utime.
timeThe sum of utime and stime. The corresponding
value is in the same format as for utime.
cutimecstimectimeLike utime, stime, and time, but include the
times of all the child processes of the given process.
priThe numerical priority of the process.
niceThe nice value of the process, a number. (Processes with smaller nice values get scheduled more favorably.)
thcountThe number of threads in the process.
startThe time when the process was started, in the same
(high low microsec picosec) format used by
file-attributes and current-time.
etimeThe time elapsed since the process started, in the format (high
low microsec picosec).
vsizeThe virtual memory size of the process, measured in kilobytes.
rssThe size of the process’s resident set, the number of kilobytes occupied by the process in the machine’s physical memory.
pcpuThe percentage of the CPU time used by the process since it started. The corresponding value is a floating-point number between 0 and 100.
pmemThe percentage of the total physical memory installed on the machine used by the process’s resident set. The value is a floating-point number between 0 and 100.
argsThe command-line with which the process was invoked. This is a string
in which individual command-line arguments are separated by blanks;
whitespace characters that are embedded in the arguments are quoted as
appropriate for the system’s shell: escaped by backslash characters on
GNU and Unix, and enclosed in double quote characters on Windows.
Thus, this command-line string can be directly used in primitives such
as shell-command.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can use a transaction queue to communicate with a subprocess
using transactions. First use tq-create to create a transaction
queue communicating with a specified process. Then you can call
tq-enqueue to send a transaction.
This function creates and returns a transaction queue communicating with process. The argument process should be a subprocess capable of sending and receiving streams of bytes. It may be a child process, or it may be a TCP connection to a server, possibly on another machine.
This function sends a transaction to queue queue. Specifying the queue has the effect of specifying the subprocess to talk to.
The argument question is the outgoing message that starts the transaction. The argument fn is the function to call when the corresponding answer comes back; it is called with two arguments: closure, and the answer received.
The argument regexp is a regular expression that should match
text at the end of the entire answer, but nothing before; that’s how
tq-enqueue determines where the answer ends.
If the argument delay-question is non-nil, delay sending
this question until the process has finished replying to any previous
questions. This produces more reliable results with some processes.
Shut down transaction queue queue, waiting for all pending transactions to complete, and then terminate the connection or child process.
Transaction queues are implemented by means of a filter function. See section Process Filter Functions.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lisp programs can open stream (TCP) and datagram (UDP) network
connections (see section Datagrams) to other processes on the same machine
or other machines.
A network connection is handled by Lisp much like a subprocess, and is
represented by a process object. However, the process you are
communicating with is not a child of the Emacs process, has no
process ID, and you can’t kill it or send it signals. All you
can do is send and receive data. delete-process closes the
connection, but does not kill the program at the other end; that
program must decide what to do about closure of the connection.
Lisp programs can listen for connections by creating network servers. A network server is also represented by a kind of process object, but unlike a network connection, the network server never transfers data itself. When it receives a connection request, it creates a new network connection to represent the connection just made. (The network connection inherits certain information, including the process plist, from the server.) The network server then goes back to listening for more connection requests.
Network connections and servers are created by calling
make-network-process with an argument list consisting of
keyword/argument pairs, for example :server t to create a
server process, or :type 'datagram to create a datagram
connection. See section Low-Level Network Access, for details. You can also use
the open-network-stream function described below.
To distinguish the different types of processes, the
process-type function returns the symbol network for a
network connection or server, serial for a serial port
connection, or real for a real subprocess.
The process-status function returns open,
closed, connect, or failed for network
connections. For a network server, the status is always
listen. None of those values is possible for a real
subprocess. See section Process Information.
You can stop and resume operation of a network process by calling
stop-process and continue-process. For a server
process, being stopped means not accepting new connections. (Up to 5
connection requests will be queued for when you resume the server; you
can increase this limit, unless it is imposed by the operating
system—see the :server keyword of make-network-process,
make-network-process.) For a network stream connection, being
stopped means not processing input (any arriving input waits until you
resume the connection). For a datagram connection, some number of
packets may be queued but input may be lost. You can use the function
process-command to determine whether a network connection or
server is stopped; a non-nil value means yes.
Emacs can create encrypted network connections, using either built-in
or external support. The built-in support uses the GnuTLS
(“Transport Layer Security”) library; see
the GnuTLS project page.
If your Emacs was compiled with GnuTLS support, the function
gnutls-available-p is defined and returns non-nil. For
more details, see Overview in The Emacs-GnuTLS manual.
The external support uses the starttls.el library, which
requires a helper utility such as gnutls-cli to be installed
on the system. The open-network-stream function can
transparently handle the details of creating encrypted connections for
you, using whatever support is available.
This function opens a TCP connection, with optional encryption, and returns a process object that represents the connection.
The name argument specifies the name for the process object. It is modified as necessary to make it unique.
The buffer argument is the buffer to associate with the
connection. Output from the connection is inserted in the buffer,
unless you specify your own filter function to handle the output. If
buffer is nil, it means that the connection is not
associated with any buffer.
The arguments host and service specify where to connect to; host is the host name (a string), and service is the name of a defined network service (a string) or a port number (an integer).
The remaining arguments parameters are keyword/argument pairs that are mainly relevant to encrypted connections:
:nowait booleanIf non-nil, try to make an asynchronous connection.
:type typeThe type of connection. Options are:
plainAn ordinary, unencrypted connection.
tlssslA TLS (“Transport Layer Security”) connection.
nilnetworkStart with a plain connection, and if parameters ‘:success’ and ‘:capability-command’ are supplied, try to upgrade to an encrypted connection via STARTTLS. If that fails, retain the unencrypted connection.
starttlsAs for nil, but if STARTTLS fails drop the connection.
shellA shell connection.
:always-query-capabilities booleanIf non-nil, always ask for the server’s capabilities, even when
doing a ‘plain’ connection.
:capability-command capability-commandCommand string to query the host capabilities.
:end-of-command regexp:end-of-capability regexpRegular expression matching the end of a command, or the end of the command capability-command. The latter defaults to the former.
:starttls-function functionFunction of one argument (the response to capability-command),
which returns either nil, or the command to activate STARTTLS
if supported.
:success regexpRegular expression matching a successful STARTTLS negotiation.
:use-starttls-if-possible booleanIf non-nil, do opportunistic STARTTLS upgrades even if Emacs
doesn’t have built-in TLS support.
:client-certificate list-or-tEither a list of the form (key-file cert-file),
naming the certificate key file and certificate file itself, or
t, meaning to query auth-source for this information
(see Overview in The Auth-Source Manual).
Only used for TLS or STARTTLS.
:return-list cons-or-nilThe return value of this function. If omitted or nil, return a
process object. Otherwise, a cons of the form (process-object
. plist), where plist has keywords:
:greeting string-or-nilIf non-nil, the greeting string returned by the host.
:capabilities string-or-nilIf non-nil, the host’s capability string.
:type symbolThe connection type: ‘plain’ or ‘tls’.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You create a server by calling make-network-process
(see section make-network-process) with :server t. The server will
listen for connection requests from clients. When it accepts a client
connection request, that creates a new network connection, itself a
process object, with the following parameters:
The server’s process buffer value is never used directly, but the log function can retrieve it and use it to log connections by inserting text there.
process-contact
keywords :host, :service, :remote.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A datagram connection communicates with individual packets rather
than streams of data. Each call to process-send sends one
datagram packet (see section Sending Input to Processes), and each datagram
received results in one call to the filter function.
The datagram connection doesn’t have to talk with the same remote
peer all the time. It has a remote peer address which specifies
where to send datagrams to. Each time an incoming datagram is passed
to the filter function, the peer address is set to the address that
datagram came from; that way, if the filter function sends a datagram,
it will go back to that place. You can specify the remote peer
address when you create the datagram connection using the
:remote keyword. You can change it later on by calling
set-process-datagram-address.
If process is a datagram connection or server, this function returns its remote peer address.
If process is a datagram connection or server, this function sets its remote peer address to address.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can also create network connections by operating at a lower
level than that of open-network-stream, using
make-network-process.
36.17.1 make-network-process | Using make-network-process.
| |
| 36.17.2 Network Options | Further control over network connections. | |
| 36.17.3 Testing Availability of Network Features | Determining which network features work on the machine you are using. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
make-network-processThe basic function for creating network connections and network
servers is make-network-process. It can do either of those
jobs, depending on the arguments you give it.
This function creates a network connection or server and returns the
process object that represents it. The arguments args are a
list of keyword/argument pairs. Omitting a keyword is always
equivalent to specifying it with value nil, except for
:coding, :filter-multibyte, and :reuseaddr. Here
are the meaningful keywords (those corresponding to network options
are listed in the following section):
Use the string name as the process name. It is modified if necessary to make it unique.
Specify the communication type. A value of nil specifies a
stream connection (the default); datagram specifies a datagram
connection; seqpacket specifies a “sequenced packet stream”
connection. Both connections and servers can be of these types.
If server-flag is non-nil, create a server. Otherwise,
create a connection. For a stream type server, server-flag may
be an integer, which then specifies the length of the queue of pending
connections to the server. The default queue length is 5.
Specify the host to connect to. host should be a host name or
Internet address, as a string, or the symbol local to specify
the local host. If you specify host for a server, it must
specify a valid address for the local host, and only clients
connecting to that address will be accepted.
service specifies a port number to connect to; or, for a server,
the port number to listen on. It should be a service name that
translates to a port number, or an integer specifying the port number
directly. For a server, it can also be t, which means to let
the system select an unused port number.
family specifies the address (and protocol) family for
communication. nil means determine the proper address family
automatically for the given host and service.
local specifies a Unix socket, in which case host is
ignored. ipv4 and ipv6 specify to use IPv4 and IPv6,
respectively.
For a server process, local-address is the address to listen on. It overrides family, host and service, so you might as well not specify them.
For a connection, remote-address is the address to connect to. It overrides family, host and service, so you might as well not specify them.
For a datagram server, remote-address specifies the initial setting of the remote datagram address.
The format of local-address or remote-address depends on the address family:
[a b c d p] corresponding to
numeric IPv4 address a.b.c.d and port number
p.
[a b c d e f
g h p] corresponding to numeric IPv6 address
a:b:c:d:e:f:g:h and
port number p.
(f . av), where f is the family number and
av is a vector specifying the socket address using one element
per address data byte. Do not rely on this format in portable code,
as it may depend on implementation defined constants, data sizes, and
data structure alignment.
If bool is non-nil for a stream connection, return
without waiting for the connection to complete. When the connection
succeeds or fails, Emacs will call the sentinel function, with a
second argument matching "open" (if successful) or
"failed". The default is to block, so that
make-network-process does not return until the connection
has succeeded or failed.
If stopped is non-nil, start the network connection or
server in the “stopped” state.
Use buffer as the process buffer.
Use coding as the coding system for this process. To specify
different coding systems for decoding data from the connection and for
encoding data sent to it, specify (decoding .
encoding) for coding.
If you don’t specify this keyword at all, the default is to determine the coding systems from the data.
Initialize the process query flag to query-flag. See section Querying Before Exit.
Initialize the process filter to filter.
If multibyte is non-nil, strings given to the process
filter are multibyte, otherwise they are unibyte. The default is the
default value of enable-multibyte-characters.
Initialize the process sentinel to sentinel.
Initialize the log function of a server process to log. The log function is called each time the server accepts a network connection from a client. The arguments passed to the log function are server, connection, and message; where server is the server process, connection is the new process for the connection, and message is a string describing what has happened.
Initialize the process plist to plist.
The original argument list, modified with the actual connection
information, is available via the process-contact function.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The following network options can be specified when you create a
network process. Except for :reuseaddr, you can also set or
modify these options later, using set-network-process-option.
For a server process, the options specified with
make-network-process are not inherited by the client
connections, so you will need to set the necessary options for each
child connection as it is created.
If device-name is a non-empty string identifying a network
interface name (see network-interface-list), only handle
packets received on that interface. If device-name is nil
(the default), handle packets received on any interface.
Using this option may require special privileges on some systems.
If broadcast-flag is non-nil for a datagram process, the
process will receive datagram packet sent to a broadcast address, and
be able to send packets to a broadcast address. This is ignored for a stream
connection.
If dontroute-flag is non-nil, the process can only send
to hosts on the same network as the local host.
If keepalive-flag is non-nil for a stream connection,
enable exchange of low-level keep-alive messages.
If linger-arg is non-nil, wait for successful
transmission of all queued packets on the connection before it is
deleted (see delete-process). If linger-arg is an
integer, it specifies the maximum time in seconds to wait for queued
packets to be sent before closing the connection. The default is
nil, which means to discard unsent queued packets when the
process is deleted.
If oobinline-flag is non-nil for a stream connection,
receive out-of-band data in the normal data stream. Otherwise, ignore
out-of-band data.
Set the priority for packets sent on this connection to the integer priority. The interpretation of this number is protocol specific; such as setting the TOS (type of service) field on IP packets sent on this connection. It may also have system dependent effects, such as selecting a specific output queue on the network interface.
If reuseaddr-flag is non-nil (the default) for a stream
server process, allow this server to reuse a specific port number (see
:service), unless another process on this host is already
listening on that port. If reuseaddr-flag is nil, there
may be a period of time after the last use of that port (by any
process on the host) where it is not possible to make a new server on
that port.
This function sets or modifies a network option for network process
process. The accepted options and values are as for
make-network-process. If no-error is non-nil,
this function returns nil instead of signaling an error if
option is not a supported option. If the function successfully
completes, it returns t.
The current setting of an option is available via the
process-contact function.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To test for the availability of a given network feature, use
featurep like this:
(featurep 'make-network-process '(keyword value))
The result of this form is t if it works to specify
keyword with value value in make-network-process.
Here are some of the keyword—value pairs you can test in
this way.
(:nowait t)Non-nil if non-blocking connect is supported.
(:type datagram)Non-nil if datagrams are supported.
(:family local)Non-nil if local (a.k.a. “UNIX domain”) sockets are supported.
(:family ipv6)Non-nil if IPv6 is supported.
(:service t)Non-nil if the system can select the port for a server.
To test for the availability of a given network option, use
featurep like this:
(featurep 'make-network-process 'keyword)
The accepted keyword values are :bindtodevice, etc.
For the complete list, see section Network Options. This form returns
non-nil if that particular network option is supported by
make-network-process (or set-network-process-option).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These additional functions are useful for creating and operating on network connections. Note that they are supported only on some systems.
This function returns a list describing the network interfaces
of the machine you are using. The value is an alist whose
elements have the form (name . address).
address has the same form as the local-address
and remote-address arguments to make-network-process.
This function returns information about the network interface named
ifname. The value is a list of the form
(addr bcast netmask hwaddr flags).
The Internet protocol address.
The broadcast address.
The network mask.
The layer 2 address (Ethernet MAC address, for instance).
The current flags of the interface.
This function converts the Lisp representation of a network address to a string.
A five-element vector [a b c d p]
represents an IPv4 address a.b.c.d and port
number p. format-network-address converts that to the
string "a.b.c.d:p".
A nine-element vector [a b c d e
f g h p] represents an IPv6 address along
with a port number. format-network-address converts that to
the string
"[a:b:c:d:e:f:g:h]:p".
If the vector does not include the port number, p, or if
omit-port is non-nil, the result does not include the
:p suffix.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs can communicate with serial ports. For interactive use,
M-x serial-term opens a terminal window. In a Lisp program,
make-serial-process creates a process object.
The serial port can be configured at run-time, without having to
close and re-open it. The function serial-process-configure
lets you change the speed, bytesize, and other parameters. In a
terminal window created by serial-term, you can click on the
mode line for configuration.
A serial connection is represented by a process object, which can be
used in a similar way to a subprocess or network process. You can send and
receive data, and configure the serial port. A serial process object
has no process ID, however, and you can’t send signals to it, and the
status codes are different from other types of processes.
delete-process on the process object or kill-buffer on
the process buffer close the connection, but this does not affect the
device connected to the serial port.
The function process-type returns the symbol serial
for a process object representing a serial port connection.
Serial ports are available on GNU/Linux, Unix, and MS Windows systems.
Start a terminal-emulator for a serial port in a new buffer. port is the name of the serial port to connect to. For example, this could be /dev/ttyS0 on Unix. On MS Windows, this could be COM1, or \\.\COM10 (double the backslashes in Lisp strings).
speed is the speed of the serial port in bits per second. 9600 is a common value. The buffer is in Term mode; see Term Mode in The GNU Emacs Manual, for the commands to use in that buffer. You can change the speed and the configuration in the mode line menu.
This function creates a process and a buffer. Arguments are specified as keyword/argument pairs. Here’s the list of the meaningful keywords, with the first two (port and speed) being mandatory:
:port portThis is the name of the serial port. On Unix and GNU systems, this is a file name such as /dev/ttyS0. On Windows, this could be COM1, or \\.\COM10 for ports higher than COM9 (double the backslashes in Lisp strings).
:speed speedThe speed of the serial port in bits per second. This function calls
serial-process-configure to handle the speed; see the
following documentation of that function for more details.
:name nameThe name of the process. If name is not given, port will serve as the process name as well.
:buffer bufferThe buffer to associate with the process. The value can be either a
buffer or a string that names a buffer. Process output goes at the
end of that buffer, unless you specify an output stream or filter
function to handle the output. If buffer is not given, the
process buffer’s name is taken from the value of the :name
keyword.
:coding codingIf coding is a symbol, it specifies the coding system used for
both reading and writing for this process. If coding is a cons
(decoding . encoding), decoding is used for
reading, and encoding is used for writing. If not specified,
the default is to determine the coding systems from the data itself.
:noquery query-flagInitialize the process query flag to query-flag. See section Querying Before Exit. The flags defaults to nil if unspecified.
:stop boolStart process in the “stopped” state if bool is
non-nil. In the stopped state, a serial process does not
accept incoming data, but you can send outgoing data. The stopped
state is cleared by continue-process and set by
stop-process.
:filter filterInstall filter as the process filter.
:sentinel sentinelInstall sentinel as the process sentinel.
:plist plistInstall plist as the initial plist of the process.
:bytesize:parity:stopbits:flowcontrolThese are handled by serial-process-configure, which is called
by make-serial-process.
The original argument list, possibly modified by later configuration,
is available via the function process-contact.
Here is an example:
(make-serial-process :port "/dev/ttyS0" :speed 9600)
This function configures a serial port connection. Arguments are
specified as keyword/argument pairs. Attributes that are not given
are re-initialized from the process’s current configuration (available
via the function process-contact), or set to reasonable default
values. The following arguments are defined:
:process process:name name:buffer buffer:port portAny of these arguments can be given to identify the process that is to be configured. If none of these arguments is given, the current buffer’s process is used.
:speed speedThe speed of the serial port in bits per second, a.k.a. baud
rate. The value can be any number, but most serial ports work only
at a few defined values between 1200 and 115200, with 9600 being the
most common value. If speed is nil, the function ignores
all other arguments and does not configure the port. This may be
useful for special serial ports such as Bluetooth-to-serial converters,
which can only be configured through ‘AT’ commands sent through the
connection. The value of nil for speed is valid only for
connections that were already opened by a previous call to
make-serial-process or serial-term.
:bytesize bytesizeThe number of bits per byte, which can be 7 or 8. If bytesize
is not given or nil, it defaults to 8.
:parity parityThe value can be nil (don’t use parity), the symbol
odd (use odd parity), or the symbol even (use even
parity). If parity is not given, it defaults to no parity.
:stopbits stopbitsThe number of stopbits used to terminate a transmission
of each byte. stopbits can be 1 or 2. If stopbits is not
given or nil, it defaults to 1.
:flowcontrol flowcontrolThe type of flow control to use for this connection, which is either
nil (don’t use flow control), the symbol hw (use RTS/CTS
hardware flow control), or the symbol sw (use XON/XOFF software
flow control). If flowcontrol is not given, it defaults to no
flow control.
Internally, make-serial-process calls
serial-process-configure for the initial configuration of the
serial port.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes how to pack and unpack arrays of bytes,
usually for binary network protocols. These functions convert byte arrays
to alists, and vice versa. The byte array can be represented as a
unibyte string or as a vector of integers, while the alist associates
symbols either with fixed-size objects or with recursive sub-alists.
To use the functions referred to in this section, load the
bindat library.
Conversion from byte arrays to nested alists is also known as deserializing or unpacking, while going in the opposite direction is also known as serializing or packing.
| 36.20.1 Describing Data Layout | Describing data layout. | |
| 36.20.2 Functions to Unpack and Pack Bytes | Doing the unpacking and packing. | |
| 36.20.3 Examples of Byte Unpacking and Packing | Samples of what bindat.el can do for you! |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To control unpacking and packing, you write a data layout specification, a special nested list describing named and typed fields. This specification controls the length of each field to be processed, and how to pack or unpack it. We normally keep bindat specs in variables whose names end in ‘-bindat-spec’; that kind of name is automatically recognized as “risky”.
A field’s type describes the size (in bytes) of the object
that the field represents and, in the case of multibyte fields, how
the bytes are ordered within the field. The two possible orderings
are “big endian” (also known as “network byte ordering”) and
“little endian”. For instance, the number #x23cd (decimal
9165) in big endian would be the two bytes #x23 #xcd;
and in little endian, #xcd #x23. Here are the possible
type values:
u8byteUnsigned byte, with length 1.
u16wordshortUnsigned integer in network byte order, with length 2.
u24Unsigned integer in network byte order, with length 3.
u32dwordlongUnsigned integer in network byte order, with length 4. Note: These values may be limited by Emacs’s integer implementation limits.
u16ru24ru32rUnsigned integer in little endian order, with length 2, 3 and 4, respectively.
str lenString of length len.
strz lenZero-terminated string, in a fixed-size field with length len.
vec len [type]Vector of len elements of type type, defaulting to bytes.
The type is any of the simple types above, or another vector
specified as a list of the form (vec len [type]).
ipFour-byte vector representing an Internet address. For example:
[127 0 0 1] for localhost.
bits lenList of set bits in len bytes. The bytes are taken in big
endian order and the bits are numbered starting with 8 *
len - 1 and ending with zero. For example: bits
2 unpacks #x28 #x1c to (2 3 4 11 13) and
#x1c #x28 to (3 5 10 11 12).
(eval form)form is a Lisp expression evaluated at the moment the field is unpacked or packed. The result of the evaluation should be one of the above-listed type specifications.
For a fixed-size field, the length len is given as an integer specifying the number of bytes in the field.
When the length of a field is not fixed, it typically depends on the
value of a preceding field. In this case, the length len can be
given either as a list (name ...) identifying a
field name in the format specified for bindat-get-field
below, or by an expression (eval form) where form
should evaluate to an integer, specifying the field length.
A field specification generally has the form ([name]
handler), where name is optional. Don’t use names that
are symbols meaningful as type specifications (above) or handler
specifications (below), since that would be ambiguous. name can
be a symbol or an expression (eval form), in which case
form should evaluate to a symbol.
handler describes how to unpack or pack the field and can be one of the following:
typeUnpack/pack this field according to the type specification type.
eval formEvaluate form, a Lisp expression, for side-effect only. If the field name is specified, the value is bound to that field name.
fill lenSkip len bytes. In packing, this leaves them unchanged, which normally means they remain zero. In unpacking, this means they are ignored.
align lenSkip to the next multiple of len bytes.
struct spec-nameProcess spec-name as a sub-specification. This describes a structure nested within another structure.
union form (tag spec)…Evaluate form, a Lisp expression, find the first tag that matches it, and process its associated data layout specification spec. Matching can occur in one of three ways:
(eval expr), evaluate
expr with the variable tag dynamically bound to the value
of form. A non-nil result indicates a match.
equal to the value of form.
t.
repeat count field-specs…Process the field-specs recursively, in order, then repeat
starting from the first one, processing all the specifications count
times overall. The count is given using the same formats as a
field length—if an eval form is used, it is evaluated just once.
For correct operation, each specification in field-specs must
include a name.
For the (eval form) forms used in a bindat specification,
the form can access and update these dynamically bound variables
during evaluation:
lastValue of the last field processed.
bindat-rawThe data as a byte array.
bindat-idxCurrent index (within bindat-raw) for unpacking or packing.
structThe alist containing the structured data that have been unpacked so
far, or the entire structure being packed. You can use
bindat-get-field to access specific fields of this structure.
countindexInside a repeat block, these contain the maximum number of
repetitions (as specified by the count parameter), and the
current repetition number (counting from 0). Setting count to
zero will terminate the inner-most repeat block after the current
repetition has completed.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In the following documentation, spec refers to a data layout
specification, bindat-raw to a byte array, and struct to an
alist representing unpacked field data.
This function unpacks data from the unibyte string or byte
array bindat-raw
according to spec. Normally, this starts unpacking at the
beginning of the byte array, but if bindat-idx is non-nil, it
specifies a zero-based starting position to use instead.
The value is an alist or nested alist in which each element describes one unpacked field.
This function selects a field’s data from the nested alist
struct. Usually struct was returned by
bindat-unpack. If name corresponds to just one argument,
that means to extract a top-level field value. Multiple name
arguments specify repeated lookup of sub-structures. An integer name
acts as an array index.
For example, if name is (a b 2 c), that means to find
field c in the third element of subfield b of field
a. (This corresponds to struct.a.b[2].c in C.)
Although packing and unpacking operations change the organization of data (in memory), they preserve the data’s total length, which is the sum of all the fields’ lengths, in bytes. This value is not generally inherent in either the specification or alist alone; instead, both pieces of information contribute to its calculation. Likewise, the length of a string or array being unpacked may be longer than the data’s total length as described by the specification.
This function returns the total length of the data in struct, according to spec.
This function returns a byte array packed according to spec from
the data in the alist struct. It normally creates and fills a
new byte array starting at the beginning. However, if bindat-raw
is non-nil, it specifies a pre-allocated unibyte string or vector to
pack into. If bindat-idx is non-nil, it specifies the starting
offset for packing into bindat-raw.
When pre-allocating, you should make sure (length bindat-raw)
meets or exceeds the total length to avoid an out-of-range error.
Convert the Internet address vector ip to a string in the usual dotted notation.
(bindat-ip-to-string [127 0 0 1])
⇒ "127.0.0.1"
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here is a complete example of byte unpacking and packing:
(require 'bindat)
(defvar fcookie-index-spec
'((:version u32)
(:count u32)
(:longest u32)
(:shortest u32)
(:flags u32)
(:delim u8)
(:ignored fill 3)
(:offset repeat (:count) (:foo u32)))
"Description of a fortune cookie index file's contents.")
(defun fcookie (cookies &optional index)
"Display a random fortune cookie from file COOKIES.
Optional second arg INDEX specifies the associated index
filename, by default \"COOKIES.dat\". Display cookie text
in buffer \"*Fortune Cookie: BASENAME*\", where BASENAME
is COOKIES without the directory part."
(interactive "fCookies file: ")
(let* ((info (with-temp-buffer
(insert-file-contents-literally
(or index (concat cookies ".dat")))
(bindat-unpack fcookie-index-spec
(buffer-string))))
(sel (random (bindat-get-field info :count)))
(beg (cdar (bindat-get-field info :offset sel)))
(end (or (cdar (bindat-get-field info
:offset (1+ sel)))
(nth 7 (file-attributes cookies)))))
(switch-to-buffer
(get-buffer-create
(format "*Fortune Cookie: %s*"
(file-name-nondirectory cookies))))
(erase-buffer)
(insert-file-contents-literally
cookies nil beg (- end 3))))
(defun fcookie-create-index (cookies &optional index delim)
"Scan file COOKIES, and write out its index file.
Optional arg INDEX specifies the index filename, which by
default is \"COOKIES.dat\". Optional arg DELIM specifies the
unibyte character that, when found on a line of its own in
COOKIES, indicates the border between entries."
(interactive "fCookies file: ")
(setq delim (or delim ?%))
(let ((delim-line (format "\n%c\n" delim))
(count 0)
(max 0)
min p q len offsets)
(unless (= 3 (string-bytes delim-line))
(error "Delimiter cannot be represented in one byte"))
(with-temp-buffer
(insert-file-contents-literally cookies)
(while (and (setq p (point))
(search-forward delim-line (point-max) t)
(setq len (- (point) 3 p)))
(setq count (1+ count)
max (max max len)
min (min (or min max) len)
offsets (cons (1- p) offsets))))
(with-temp-buffer
(set-buffer-multibyte nil)
(insert
(bindat-pack
fcookie-index-spec
`((:version . 2)
(:count . ,count)
(:longest . ,max)
(:shortest . ,min)
(:flags . 0)
(:delim . ,delim)
(:offset . ,(mapcar (lambda (o)
(list (cons :foo o)))
(nreverse offsets))))))
(let ((coding-system-for-write 'raw-text-unix))
(write-file (or index (concat cookies ".dat")))))))
The following is an example of defining and unpacking a complex structure. Consider the following C structures:
struct header {
unsigned long dest_ip;
unsigned long src_ip;
unsigned short dest_port;
unsigned short src_port;
};
struct data {
unsigned char type;
unsigned char opcode;
unsigned short length; /* in network byte order */
unsigned char id[8]; /* null-terminated string */
unsigned char data[/* (length + 3) & ~3 */];
};
struct packet {
struct header header;
unsigned long counters[2]; /* in little endian order */
unsigned char items;
unsigned char filler[3];
struct data item[/* items */];
};
The corresponding data layout specification is:
(setq header-spec
'((dest-ip ip)
(src-ip ip)
(dest-port u16)
(src-port u16)))
(setq data-spec
'((type u8)
(opcode u8)
(length u16) ; network byte order
(id strz 8)
(data vec (length))
(align 4)))
(setq packet-spec
'((header struct header-spec)
(counters vec 2 u32r) ; little endian order
(items u8)
(fill 3)
(item repeat (items)
(struct data-spec))))
A binary data representation is:
(setq binary-data
[ 192 168 1 100 192 168 1 101 01 28 21 32
160 134 1 0 5 1 0 0 2 0 0 0
2 3 0 5 ?A ?B ?C ?D ?E ?F 0 0 1 2 3 4 5 0 0 0
1 4 0 7 ?B ?C ?D ?E ?F ?G 0 0 6 7 8 9 10 11 12 0 ])
The corresponding decoded structure is:
(setq decoded (bindat-unpack packet-spec binary-data))
⇒
((header
(dest-ip . [192 168 1 100])
(src-ip . [192 168 1 101])
(dest-port . 284)
(src-port . 5408))
(counters . [100000 261])
(items . 2)
(item ((data . [1 2 3 4 5])
(id . "ABCDEF")
(length . 5)
(opcode . 3)
(type . 2))
((data . [6 7 8 9 10 11 12])
(id . "BCDEFG")
(length . 7)
(opcode . 4)
(type . 1))))
An example of fetching data from this structure:
(bindat-get-field decoded 'item 1 'id)
⇒ "BCDEFG"
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This chapter describes a number of features related to the display that Emacs presents to the user.
| 37.1 Refreshing the Screen | Clearing the screen and redrawing everything on it. | |
| 37.2 Forcing Redisplay | Forcing redisplay. | |
| 37.3 Truncation | Folding or wrapping long text lines. | |
| 37.4 The Echo Area | Displaying messages at the bottom of the screen. | |
| 37.5 Reporting Warnings | Displaying warning messages for the user. | |
| 37.6 Invisible Text | Hiding part of the buffer text. | |
| 37.7 Selective Display | Hiding part of the buffer text (the old way). | |
| 37.8 Temporary Displays | Displays that go away automatically. | |
| 37.9 Overlays | Use overlays to highlight parts of the buffer. | |
| 37.10 Size of Displayed Text | How large displayed text is. | |
| 37.11 Line Height | Controlling the height of lines. | |
| 37.12 Faces | A face defines a graphics style for text characters: font, colors, etc. | |
| 37.13 Fringes | Controlling window fringes. | |
| 37.14 Scroll Bars | Controlling vertical scroll bars. | |
| 37.15 Window Dividers | Separating windows visually. | |
37.16 The display Property | Enabling special display features. | |
| 37.17 Images | Displaying images in Emacs buffers. | |
| 37.18 Buttons | Adding clickable buttons to Emacs buffers. | |
| 37.19 Abstract Display | Emacs’s Widget for Object Collections. | |
| 37.20 Blinking Parentheses | How Emacs shows the matching open parenthesis. | |
| 37.21 Character Display | How Emacs displays individual characters. | |
| 37.22 Beeping | Audible signal to the user. | |
| 37.23 Window Systems | Which window system is being used. | |
| 37.24 Bidirectional Display | Display of bidirectional scripts, such as Arabic and Farsi. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The function redraw-frame clears and redisplays the entire
contents of a given frame (see section Frames). This is useful if the
screen is corrupted.
This function clears and redisplays frame frame.
Even more powerful is redraw-display:
This function clears and redisplays all visible frames.
In Emacs, processing user input takes priority over redisplay. If you call these functions when input is available, they don’t redisplay immediately, but the requested redisplay does happen eventually—after all the input has been processed.
On text terminals, suspending and resuming Emacs normally also refreshes the screen. Some terminal emulators record separate contents for display-oriented programs such as Emacs and for ordinary sequential display. If you are using such a terminal, you might want to inhibit the redisplay on resumption.
This variable controls whether Emacs redraws the entire screen after it
has been suspended and resumed. Non-nil means there is no need
to redraw, nil means redrawing is needed. The default is nil.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs normally tries to redisplay the screen whenever it waits for input. With the following function, you can request an immediate attempt to redisplay, in the middle of Lisp code, without actually waiting for input.
This function tries immediately to redisplay. The optional argument
force, if non-nil, forces the redisplay to be performed,
instead of being preempted if input is pending.
The function returns t if it actually tried to redisplay, and
nil otherwise. A value of t does not mean that
redisplay proceeded to completion; it could have been preempted by
newly arriving input.
A function run just before redisplay. It is called with one argument, the set of windows to redisplay.
Although redisplay tries immediately to redisplay, it does
not change how Emacs decides which parts of its frame(s) to redisplay.
By contrast, the following function adds certain windows to the
pending redisplay work (as if their contents had completely changed),
but does not immediately try to perform redisplay.
This function forces some or all windows to be updated the next time
Emacs does a redisplay. If object is a window, that window is
to be updated. If object is a buffer or buffer name, all
windows displaying that buffer are to be updated. If object is
nil (or omitted), all windows are to be updated.
This function does not do a redisplay immediately; Emacs does that as
it waits for input, or when the function redisplay is called.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When a line of text extends beyond the right edge of a window, Emacs can continue the line (make it “wrap” to the next screen line), or truncate the line (limit it to one screen line). The additional screen lines used to display a long text line are called continuation lines. Continuation is not the same as filling; continuation happens on the screen only, not in the buffer contents, and it breaks a line precisely at the right margin, not at a word boundary. See section Filling.
On a graphical display, tiny arrow images in the window fringes indicate truncated and continued lines (see section Fringes). On a text terminal, a ‘$’ in the rightmost column of the window indicates truncation; a ‘\’ on the rightmost column indicates a line that “wraps”. (The display table can specify alternate characters to use for this; see section Display Tables).
If this buffer-local variable is non-nil, lines that extend
beyond the right edge of the window are truncated; otherwise, they are
continued. As a special exception, the variable
truncate-partial-width-windows takes precedence in
partial-width windows (i.e., windows that do not occupy the
entire frame width).
This variable controls line truncation in partial-width windows.
A partial-width window is one that does not occupy the entire frame
width (see section Splitting Windows). If the value is nil, line
truncation is determined by the variable truncate-lines (see
above). If the value is an integer n, lines are truncated if
the partial-width window has fewer than n columns, regardless of
the value of truncate-lines; if the partial-width window has
n or more columns, line truncation is determined by
truncate-lines. For any other non-nil value, lines are
truncated in every partial-width window, regardless of the value of
truncate-lines.
When horizontal scrolling (see section Horizontal Scrolling) is in use in a window, that forces truncation.
If this buffer-local variable is non-nil, it defines a
wrap prefix which Emacs displays at the start of every
continuation line. (If lines are truncated, wrap-prefix is
never used.) Its value may be a string or an image (see section Other Display Specifications), or a stretch of whitespace such as specified by the
:width or :align-to display properties (see section Specified Spaces). The value is interpreted in the same way as a display
text property. See section The display Property.
A wrap prefix may also be specified for regions of text, using the
wrap-prefix text or overlay property. This takes precedence
over the wrap-prefix variable. See section Properties with Special Meanings.
If this buffer-local variable is non-nil, it defines a
line prefix which Emacs displays at the start of every
non-continuation line. Its value may be a string or an image
(see section Other Display Specifications), or a stretch of whitespace such as
specified by the :width or :align-to display properties
(see section Specified Spaces). The value is interpreted in the same way
as a display text property. See section The display Property.
A line prefix may also be specified for regions of text using the
line-prefix text or overlay property. This takes precedence
over the line-prefix variable. See section Properties with Special Meanings.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The echo area is used for displaying error messages
(see section Errors), for messages made with the message primitive,
and for echoing keystrokes. It is not the same as the minibuffer,
despite the fact that the minibuffer appears (when active) in the same
place on the screen as the echo area. See The
Minibuffer in The GNU Emacs Manual.
Apart from the functions documented in this section, you can print
Lisp objects to the echo area by specifying t as the output
stream. See section Output Streams.
| 37.4.1 Displaying Messages in the Echo Area | Explicitly displaying text in the echo area. | |
| 37.4.2 Reporting Operation Progress | Informing user about progress of a long operation. | |
| 37.4.3 Logging Messages in *Messages* | Echo area messages are logged for the user. | |
| 37.4.4 Echo Area Customization | Controlling the echo area. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes the standard functions for displaying messages in the echo area.
This function displays a message in the echo area.
format-string is a format string, and arguments are the
objects for its format specifications, like in the format
function (see section Formatting Strings). The resulting formatted string
is displayed in the echo area; if it contains face text
properties, it is displayed with the specified faces (see section Faces).
The string is also added to the *Messages* buffer, but without
text properties (see section Logging Messages in *Messages*).
In batch mode, the message is printed to the standard error stream, followed by a newline.
If format-string is nil or the empty string,
message clears the echo area; if the echo area has been
expanded automatically, this brings it back to its normal size. If
the minibuffer is active, this brings the minibuffer contents back
onto the screen immediately.
(message "Minibuffer depth is %d."
(minibuffer-depth))
-| Minibuffer depth is 0.
⇒ "Minibuffer depth is 0."
---------- Echo Area ---------- Minibuffer depth is 0. ---------- Echo Area ----------
To automatically display a message in the echo area or in a pop-buffer,
depending on its size, use display-message-or-buffer (see below).
This construct displays a message in the echo area temporarily, during the execution of body. It displays message, executes body, then returns the value of the last body form while restoring the previous echo area contents.
This function displays a message like message, but may display it
in a dialog box instead of the echo area. If this function is called in
a command that was invoked using the mouse—more precisely, if
last-nonmenu-event (see section Information from the Command Loop) is either
nil or a list—then it uses a dialog box or pop-up menu to
display the message. Otherwise, it uses the echo area. (This is the
same criterion that y-or-n-p uses to make a similar decision; see
Yes-or-No Queries.)
You can force use of the mouse or of the echo area by binding
last-nonmenu-event to a suitable value around the call.
This function displays a message like message, but uses a dialog
box (or a pop-up menu) whenever that is possible. If it is impossible
to use a dialog box or pop-up menu, because the terminal does not
support them, then message-box uses the echo area, like
message.
This function displays the message message, which may be either a
string or a buffer. If it is shorter than the maximum height of the
echo area, as defined by max-mini-window-height, it is displayed
in the echo area, using message. Otherwise,
display-buffer is used to show it in a pop-up buffer.
Returns either the string shown in the echo area, or when a pop-up buffer is used, the window used to display it.
If message is a string, then the optional argument buffer-name is the name of the buffer used to display it when a pop-up buffer is used, defaulting to *Message*. In the case where message is a string and displayed in the echo area, it is not specified whether the contents are inserted into the buffer anyway.
The optional arguments not-this-window and frame are as for
display-buffer, and only used if a buffer is displayed.
This function returns the message currently being displayed in the
echo area, or nil if there is none.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When an operation can take a while to finish, you should inform the user about the progress it makes. This way the user can estimate remaining time and clearly see that Emacs is busy working, not hung. A convenient way to do this is to use a progress reporter.
Here is a working example that does nothing useful:
(let ((progress-reporter
(make-progress-reporter "Collecting mana for Emacs..."
0 500)))
(dotimes (k 500)
(sit-for 0.01)
(progress-reporter-update progress-reporter k))
(progress-reporter-done progress-reporter))
This function creates and returns a progress reporter object, which you will use as an argument for the other functions listed below. The idea is to precompute as much data as possible to make progress reporting very fast.
When this progress reporter is subsequently used, it will display
message in the echo area, followed by progress percentage.
message is treated as a simple string. If you need it to depend
on a filename, for instance, use format before calling this
function.
The arguments min-value and max-value should be numbers
standing for the starting and final states of the operation. For
instance, an operation that “scans” a buffer should set these to the
results of point-min and point-max correspondingly.
max-value should be greater than min-value.
Alternatively, you can set min-value and max-value to
nil. In that case, the progress reporter does not report
process percentages; it instead displays a “spinner” that rotates a
notch each time you update the progress reporter.
If min-value and max-value are numbers, you can give the argument current-value a numerical value specifying the initial progress; if omitted, this defaults to min-value.
The remaining arguments control the rate of echo area updates. The progress reporter will wait for at least min-change more percents of the operation to be completed before printing next message; the default is one percent. min-time specifies the minimum time in seconds to pass between successive prints; the default is 0.2 seconds. (On some operating systems, the progress reporter may handle fractions of seconds with varying precision).
This function calls progress-reporter-update, so the first
message is printed immediately.
This function does the main work of reporting progress of your operation. It displays the message of reporter, followed by progress percentage determined by value. If percentage is zero, or close enough according to the min-change and min-time arguments, then it is omitted from the output.
reporter must be the result of a call to
make-progress-reporter. value specifies the current
state of your operation and must be between min-value and
max-value (inclusive) as passed to
make-progress-reporter. For instance, if you scan a buffer,
then value should be the result of a call to point.
This function respects min-change and min-time as passed
to make-progress-reporter and so does not output new messages
on every invocation. It is thus very fast and normally you should not
try to reduce the number of calls to it: resulting overhead will most
likely negate your effort.
This function is similar to progress-reporter-update except
that it prints a message in the echo area unconditionally.
The first two arguments have the same meaning as for
progress-reporter-update. Optional new-message allows
you to change the message of the reporter. Since this function
always updates the echo area, such a change will be immediately
presented to the user.
This function should be called when the operation is finished. It prints the message of reporter followed by word “done” in the echo area.
You should always call this function and not hope for
progress-reporter-update to print “100%”. Firstly, it may
never print it, there are many good reasons for this not to happen.
Secondly, “done” is more explicit.
This is a convenience macro that works the same way as dotimes
does, but also reports loop progress using the functions described
above. It allows you to save some typing.
You can rewrite the example in the beginning of this node using this macro this way:
(dotimes-with-progress-reporter
(k 500)
"Collecting some mana for Emacs..."
(sit-for 0.01))
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Almost all the messages displayed in the echo area are also recorded
in the *Messages* buffer so that the user can refer back to
them. This includes all the messages that are output with
message. By default, this buffer is read-only and uses the major
mode messages-buffer-mode. Nothing prevents the user from
killing the *Messages* buffer, but the next display of a message
recreates it. Any Lisp code that needs to access the
*Messages* buffer directly and wants to ensure that it exists
should use the function messages-buffer.
This function returns the *Messages* buffer. If it does not
exist, it creates it, and switches it to messages-buffer-mode.
This variable specifies how many lines to keep in the *Messages*
buffer. The value t means there is no limit on how many lines to
keep. The value nil disables message logging entirely. Here’s
how to display a message and prevent it from being logged:
(let (message-log-max) (message …))
To make *Messages* more convenient for the user, the logging facility combines successive identical messages. It also combines successive related messages for the sake of two cases: question followed by answer, and a series of progress messages.
A “question followed by an answer” means two messages like the
ones produced by y-or-n-p: the first is ‘question’,
and the second is ‘question...answer’. The first
message conveys no additional information beyond what’s in the second,
so logging the second message discards the first from the log.
A “series of progress messages” means successive messages like
those produced by make-progress-reporter. They have the form
‘base...how-far’, where base is the same each
time, while how-far varies. Logging each message in the series
discards the previous one, provided they are consecutive.
The functions make-progress-reporter and y-or-n-p
don’t have to do anything special to activate the message log
combination feature. It operates whenever two consecutive messages
are logged that share a common prefix ending in ‘...’.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These variables control details of how the echo area works.
This variable controls where the cursor appears when a message is
displayed in the echo area. If it is non-nil, then the cursor
appears at the end of the message. Otherwise, the cursor appears at
point—not in the echo area at all.
The value is normally nil; Lisp programs bind it to t
for brief periods of time.
This normal hook is run whenever the echo area is cleared—either by
(message nil) or for any other reason.
This variable determines how much time should elapse before command characters echo. Its value must be a number, and specifies the number of seconds to wait before echoing. If the user types a prefix key (such as C-x) and then delays this many seconds before continuing, the prefix key is echoed in the echo area. (Once echoing begins in a key sequence, all subsequent characters in the same key sequence are echoed immediately.)
If the value is zero, then command input is not echoed.
Normally, displaying a long message resizes the echo area to display
the entire message. But if the variable message-truncate-lines
is non-nil, the echo area does not resize, and the message is
truncated to fit it.
The variable max-mini-window-height, which specifies the
maximum height for resizing minibuffer windows, also applies to the
echo area (which is really a special use of the minibuffer window;
see section Minibuffer Miscellany).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Warnings are a facility for a program to inform the user of a possible problem, but continue running.
| 37.5.1 Warning Basics | Warnings concepts and functions to report them. | |
| 37.5.2 Warning Variables | Variables programs bind to customize their warnings. | |
| 37.5.3 Warning Options | Variables users set to control display of warnings. | |
| 37.5.4 Delayed Warnings | Deferring a warning until the end of a command. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Every warning has a textual message, which explains the problem for the user, and a severity level which is a symbol. Here are the possible severity levels, in order of decreasing severity, and their meanings:
:emergencyA problem that will seriously impair Emacs operation soon if you do not attend to it promptly.
:errorA report of data or circumstances that are inherently wrong.
:warningA report of data or circumstances that are not inherently wrong, but raise suspicion of a possible problem.
:debugA report of information that may be useful if you are debugging.
When your program encounters invalid input data, it can either
signal a Lisp error by calling error or signal or report
a warning with severity :error. Signaling a Lisp error is the
easiest thing to do, but it means the program cannot continue
processing. If you want to take the trouble to implement a way to
continue processing despite the bad data, then reporting a warning of
severity :error is the right way to inform the user of the
problem. For instance, the Emacs Lisp byte compiler can report an
error that way and continue compiling other functions. (If the
program signals a Lisp error and then handles it with
condition-case, the user won’t see the error message; it could
show the message to the user by reporting it as a warning.)
Each warning has a warning type to classify it. The type is a
list of symbols. The first symbol should be the custom group that you
use for the program’s user options. For example, byte compiler
warnings use the warning type (bytecomp). You can also
subcategorize the warnings, if you wish, by using more symbols in the
list.
This function reports a warning, using message as the message
and type as the warning type. level should be the
severity level, with :warning being the default.
buffer-name, if non-nil, specifies the name of the buffer
for logging the warning. By default, it is *Warnings*.
This function reports a warning using the value of (format
message args...) as the message in the *Warnings*
buffer. In other respects it is equivalent to display-warning.
This function reports a warning using the value of (format
message args...) as the message, (emacs) as the
type, and :warning as the severity level. It exists for
compatibility only; we recommend not using it, because you should
specify a specific warning type.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Programs can customize how their warnings appear by binding the variables described in this section.
This list defines the meaning and severity order of the warning severity levels. Each element defines one severity level, and they are arranged in order of decreasing severity.
Each element has the form (level string
function), where level is the severity level it defines.
string specifies the textual description of this level.
string should use ‘%s’ to specify where to put the warning
type information, or it can omit the ‘%s’ so as not to include
that information.
The optional function, if non-nil, is a function to call
with no arguments, to get the user’s attention.
Normally you should not change the value of this variable.
If non-nil, the value is a function to generate prefix text for
warnings. Programs can bind the variable to a suitable function.
display-warning calls this function with the warnings buffer
current, and the function can insert text in it. That text becomes
the beginning of the warning message.
The function is called with two arguments, the severity level and its
entry in warning-levels. It should return a list to use as the
entry (this value need not be an actual member of
warning-levels). By constructing this value, the function can
change the severity of the warning, or specify different handling for
a given severity level.
If the variable’s value is nil then there is no function
to call.
Programs can bind this variable to t to say that the next
warning should begin a series. When several warnings form a series,
that means to leave point on the first warning of the series, rather
than keep moving it for each warning so that it appears on the last one.
The series ends when the local binding is unbound and
warning-series becomes nil again.
The value can also be a symbol with a function definition. That is
equivalent to t, except that the next warning will also call
the function with no arguments with the warnings buffer current. The
function can insert text which will serve as a header for the series
of warnings.
Once a series has begun, the value is a marker which points to the buffer position in the warnings buffer of the start of the series.
The variable’s normal value is nil, which means to handle
each warning separately.
When this variable is non-nil, it specifies a fill prefix to
use for filling each warning’s text.
This variable specifies the format for displaying the warning type
in the warning message. The result of formatting the type this way
gets included in the message under the control of the string in the
entry in warning-levels. The default value is " (%s)".
If you bind it to "" then the warning type won’t appear at
all.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These variables are used by users to control what happens when a Lisp program reports a warning.
This user option specifies the minimum severity level that should be
shown immediately to the user. The default is :warning, which
means to immediately display all warnings except :debug
warnings.
This user option specifies the minimum severity level that should be
logged in the warnings buffer. The default is :warning, which
means to log all warnings except :debug warnings.
This list specifies which warning types should not be displayed immediately for the user. Each element of the list should be a list of symbols. If its elements match the first elements in a warning type, then that warning is not displayed immediately.
This list specifies which warning types should not be logged in the warnings buffer. Each element of the list should be a list of symbols. If it matches the first few elements in a warning type, then that warning is not logged.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Sometimes, you may wish to avoid showing a warning while a command is
running, and only show it only after the end of the command. You can
use the variable delayed-warnings-list for this.
The value of this variable is a list of warnings to be displayed after the current command has finished. Each element must be a list
(type message [level [buffer-name]])
with the same form, and the same meanings, as the argument list of
display-warning (see section Warning Basics). Immediately after
running post-command-hook (see section Command Loop Overview), the Emacs
command loop displays all the warnings specified by this variable,
then resets it to nil.
Programs which need to further customize the delayed warnings
mechanism can change the variable delayed-warnings-hook:
This is a normal hook which is run by the Emacs command loop, after
post-command-hook, in order to to process and display delayed
warnings.
Its default value is a list of two functions:
(collapse-delayed-warnings display-delayed-warnings)
The function collapse-delayed-warnings removes repeated entries
from delayed-warnings-list. The function
display-delayed-warnings calls display-warning on each
of the entries in delayed-warnings-list, in turn, and then sets
delayed-warnings-list to nil.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can make characters invisible, so that they do not appear on
the screen, with the invisible property. This can be either a
text property (see section Text Properties) or an overlay property
(see section Overlays). Cursor motion also partly ignores these
characters; if the command loop finds that point is inside a range of
invisible text after a command, it relocates point to the other side
of the text.
In the simplest case, any non-nil invisible property makes
a character invisible. This is the default case—if you don’t alter
the default value of buffer-invisibility-spec, this is how the
invisible property works. You should normally use t
as the value of the invisible property if you don’t plan
to set buffer-invisibility-spec yourself.
More generally, you can use the variable buffer-invisibility-spec
to control which values of the invisible property make text
invisible. This permits you to classify the text into different subsets
in advance, by giving them different invisible values, and
subsequently make various subsets visible or invisible by changing the
value of buffer-invisibility-spec.
Controlling visibility with buffer-invisibility-spec is
especially useful in a program to display the list of entries in a
database. It permits the implementation of convenient filtering
commands to view just a part of the entries in the database. Setting
this variable is very fast, much faster than scanning all the text in
the buffer looking for properties to change.
This variable specifies which kinds of invisible properties
actually make a character invisible. Setting this variable makes it
buffer-local.
tA character is invisible if its invisible property is
non-nil. This is the default.
Each element of the list specifies a criterion for invisibility; if a
character’s invisible property fits any one of these criteria,
the character is invisible. The list can have two kinds of elements:
atomA character is invisible if its invisible property value is
atom or if it is a list with atom as a member; comparison
is done with eq.
(atom . t)A character is invisible if its invisible property value is
atom or if it is a list with atom as a member; comparison
is done with eq. Moreover, a sequence of such characters
displays as an ellipsis.
Two functions are specifically provided for adding elements to
buffer-invisibility-spec and removing elements from it.
This function adds the element element to
buffer-invisibility-spec. If buffer-invisibility-spec
was t, it changes to a list, (t), so that text whose
invisible property is t remains invisible.
This removes the element element from
buffer-invisibility-spec. This does nothing if element
is not in the list.
A convention for use of buffer-invisibility-spec is that a
major mode should use the mode’s own name as an element of
buffer-invisibility-spec and as the value of the
invisible property:
;; If you want to display an ellipsis: (add-to-invisibility-spec '(my-symbol . t)) ;; If you don’t want ellipsis: (add-to-invisibility-spec 'my-symbol) (overlay-put (make-overlay beginning end) 'invisible 'my-symbol) ;; When done with the invisibility: (remove-from-invisibility-spec '(my-symbol . t)) ;; Or respectively: (remove-from-invisibility-spec 'my-symbol)
You can check for invisibility using the following function:
If pos-or-prop is a marker or number, this function returns a
non-nil value if the text at that position is invisible.
If pos-or-prop is any other kind of Lisp object, that is taken
to mean a possible value of the invisible text or overlay
property. In that case, this function returns a non-nil value
if that value would cause text to become invisible, based on the
current value of buffer-invisibility-spec.
Ordinarily, functions that operate on text or move point do not care
whether the text is invisible, they process invisible characters and
visible characters alike. The user-level line motion commands,
such as next-line, previous-line, ignore invisible
newlines if line-move-ignore-invisible is non-nil (the
default), i.e., behave like these invisible newlines didn’t exist in
the buffer, but only because they are explicitly programmed to do so.
If a command ends with point inside or at the boundary of
invisible text, the main editing loop relocates point to one of the
two ends of the invisible text. Emacs chooses the direction of
relocation so that it is the same as the overall movement direction of
the command; if in doubt, it prefers a position where an inserted char
would not inherit the invisible property. Additionally, if the
text is not replaced by an ellipsis and the command only moved within
the invisible text, then point is moved one extra character so as to
try and reflect the command’s movement by a visible movement of the
cursor.
Thus, if the command moved point back to an invisible range (with the usual stickiness), Emacs moves point back to the beginning of that range. If the command moved point forward into an invisible range, Emacs moves point forward to the first visible character that follows the invisible text and then forward one more character.
These adjustments of point that ended up in the middle of
invisible text can be disabled by setting disable-point-adjustment
to a non-nil value. See section Adjusting Point After Commands.
Incremental search can make invisible overlays visible temporarily
and/or permanently when a match includes invisible text. To enable
this, the overlay should have a non-nil
isearch-open-invisible property. The property value should be a
function to be called with the overlay as an argument. This function
should make the overlay visible permanently; it is used when the match
overlaps the overlay on exit from the search.
During the search, such overlays are made temporarily visible by
temporarily modifying their invisible and intangible properties. If you
want this to be done differently for a certain overlay, give it an
isearch-open-invisible-temporary property which is a function.
The function is called with two arguments: the first is the overlay, and
the second is nil to make the overlay visible, or t to
make it invisible again.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Selective display refers to a pair of related features for hiding certain lines on the screen.
The first variant, explicit selective display, was designed for use in a Lisp
program: it controls which lines are hidden by altering the text. This kind of
hiding is now obsolete; instead you can get the same effect with the
invisible property (see section Invisible Text).
In the second variant, the choice of lines to hide is made automatically based on indentation. This variant is designed to be a user-level feature.
The way you control explicit selective display is by replacing a newline (control-j) with a carriage return (control-m). The text that was formerly a line following that newline is now hidden. Strictly speaking, it is temporarily no longer a line at all, since only newlines can separate lines; it is now part of the previous line.
Selective display does not directly affect editing commands. For
example, C-f (forward-char) moves point unhesitatingly
into hidden text. However, the replacement of newline characters with
carriage return characters affects some editing commands. For
example, next-line skips hidden lines, since it searches only
for newlines. Modes that use selective display can also define
commands that take account of the newlines, or that control which
parts of the text are hidden.
When you write a selectively displayed buffer into a file, all the control-m’s are output as newlines. This means that when you next read in the file, it looks OK, with nothing hidden. The selective display effect is seen only within Emacs.
This buffer-local variable enables selective display. This means that lines, or portions of lines, may be made hidden.
selective-display is t, then the character
control-m marks the start of hidden text; the control-m, and the rest
of the line following it, are not displayed. This is explicit selective
display.
selective-display is a positive integer, then
lines that start with more than that many columns of indentation are not
displayed.
When some portion of a buffer is hidden, the vertical movement
commands operate as if that portion did not exist, allowing a single
next-line command to skip any number of hidden lines.
However, character movement commands (such as forward-char) do
not skip the hidden portion, and it is possible (if tricky) to insert
or delete text in an hidden portion.
In the examples below, we show the display appearance of the
buffer foo, which changes with the value of
selective-display. The contents of the buffer do not
change.
(setq selective-display nil)
⇒ nil
---------- Buffer: foo ----------
1 on this column
2on this column
3n this column
3n this column
2on this column
1 on this column
---------- Buffer: foo ----------
(setq selective-display 2)
⇒ 2
---------- Buffer: foo ----------
1 on this column
2on this column
2on this column
1 on this column
---------- Buffer: foo ----------
If this buffer-local variable is non-nil, then Emacs displays
‘…’ at the end of a line that is followed by hidden text.
This example is a continuation of the previous one.
(setq selective-display-ellipses t)
⇒ t
---------- Buffer: foo ----------
1 on this column
2on this column ...
2on this column
1 on this column
---------- Buffer: foo ----------
You can use a display table to substitute other text for the ellipsis (‘…’). See section Display Tables.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Temporary displays are used by Lisp programs to put output into a buffer and then present it to the user for perusal rather than for editing. Many help commands use this feature.
This function executes the forms in body while arranging to insert
any output they print into the buffer named buffer-name, which is
first created if necessary, and put into Help mode. (See the similar
form with-temp-buffer-window below.) Finally, the buffer is
displayed in some window, but that window is not selected.
If the forms in body do not change the major mode in the output
buffer, so that it is still Help mode at the end of their execution,
then with-output-to-temp-buffer makes this buffer read-only at
the end, and also scans it for function and variable names to make them
into clickable cross-references. See Tips for
Documentation Strings, in particular the item on hyperlinks in
documentation strings, for more details.
The string buffer-name specifies the temporary buffer, which need
not already exist. The argument must be a string, not a buffer. The
buffer is erased initially (with no questions asked), and it is marked
as unmodified after with-output-to-temp-buffer exits.
with-output-to-temp-buffer binds standard-output to the
temporary buffer, then it evaluates the forms in body. Output
using the Lisp output functions within body goes by default to
that buffer (but screen display and messages in the echo area, although
they are “output” in the general sense of the word, are not affected).
See section Output Functions.
Several hooks are available for customizing the behavior of this construct; they are listed below.
The value of the last form in body is returned.
---------- Buffer: foo ---------- This is the contents of foo. ---------- Buffer: foo ----------
(with-output-to-temp-buffer "foo"
(print 20)
(print standard-output))
⇒ #<buffer foo>
---------- Buffer: foo ----------
20
#<buffer foo>
---------- Buffer: foo ----------
If this variable is non-nil, with-output-to-temp-buffer
calls it as a function to do the job of displaying a help buffer. The
function gets one argument, which is the buffer it should display.
It is a good idea for this function to run temp-buffer-show-hook
just as with-output-to-temp-buffer normally would, inside of
save-selected-window and with the chosen window and buffer
selected.
This normal hook is run by with-output-to-temp-buffer before
evaluating body. When the hook runs, the temporary buffer is
current. This hook is normally set up with a function to put the
buffer in Help mode.
This normal hook is run by with-output-to-temp-buffer after
displaying the temporary buffer. When the hook runs, the temporary buffer
is current, and the window it was displayed in is selected.
This macro is similar to with-output-to-temp-buffer. Like that
construct, it executes body while arranging to insert any output
it prints into the buffer named buffer-or-name and displays that
buffer in some window. Unlike with-output-to-temp-buffer,
however, it does not automatically switch that buffer to Help mode.
Like with-output-to-temp-buffer it neither makes the buffer
specified by buffer-or-name current when executing body.
The otherwise identical macro with-current-buffer-window can be
used to execute body with that buffer current.
The argument buffer-or-name specifies the temporary buffer. It
can be either a buffer, which must already exist, or a string, in which
case a buffer of that name is created, if necessary. The buffer is
marked as unmodified and read-only when with-temp-buffer-window
exits.
This macro does not call temp-buffer-show-function. Rather, it
passes the action argument to display-buffer in order to
display the buffer.
The value of the last form in body is returned, unless the argument quit-function is specified. In that case, it is called with two arguments: the window showing the buffer and the result of body. The final return value is then whatever quit-function returns.
This macro uses the normal hooks temp-buffer-window-setup-hook
and temp-buffer-window-show-hook in place of the analogous hooks
run by with-output-to-temp-buffer.
This function momentarily displays string in the current buffer at position. It has no effect on the undo list or on the buffer’s modification status.
The momentary display remains until the next input event. If the next
input event is char, momentary-string-display ignores it
and returns. Otherwise, that event remains buffered for subsequent use
as input. Thus, typing char will simply remove the string from
the display, while typing (say) C-f will remove the string from
the display and later (presumably) move point forward. The argument
char is a space by default.
The return value of momentary-string-display is not meaningful.
If the string string does not contain control characters, you can
do the same job in a more general way by creating (and then subsequently
deleting) an overlay with a before-string property.
See section Overlay Properties.
If message is non-nil, it is displayed in the echo area
while string is displayed in the buffer. If it is nil, a
default message says to type char to continue.
In this example, point is initially located at the beginning of the second line:
---------- Buffer: foo ---------- This is the contents of foo. ∗Second line. ---------- Buffer: foo ----------
(momentary-string-display "**** Important Message! ****" (point) ?\r "Type RET when done reading") ⇒ t
---------- Buffer: foo ---------- This is the contents of foo. **** Important Message! ****Second line. ---------- Buffer: foo ---------- ---------- Echo Area ---------- Type RET when done reading ---------- Echo Area ----------
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can use overlays to alter the appearance of a buffer’s text on the screen, for the sake of presentation features. An overlay is an object that belongs to a particular buffer, and has a specified beginning and end. It also has properties that you can examine and set; these affect the display of the text within the overlay.
The visual effect of an overlay is the same as of the corresponding text property (see section Text Properties). However, due to a different implementation, overlays generally don’t scale well (many operations take a time that is proportional to the number of overlays in the buffer). If you need to affect the visual appearance of many portions in the buffer, we recommend using text properties.
An overlay uses markers to record its beginning and end; thus, editing the text of the buffer adjusts the beginning and end of each overlay so that it stays with the text. When you create the overlay, you can specify whether text inserted at the beginning should be inside the overlay or outside, and likewise for the end of the overlay.
| 37.9.1 Managing Overlays | Creating and moving overlays. | |
| 37.9.2 Overlay Properties | How to read and set properties. What properties do to the screen display. | |
| 37.9.3 Searching for Overlays | Searching for overlays. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes the functions to create, delete and move overlays, and to examine their contents. Overlay changes are not recorded in the buffer’s undo list, since the overlays are not part of the buffer’s contents.
This function returns t if object is an overlay.
This function creates and returns an overlay that belongs to buffer and ranges from start to end. Both start and end must specify buffer positions; they may be integers or markers. If buffer is omitted, the overlay is created in the current buffer.
The arguments front-advance and rear-advance specify the
marker insertion type for the start of the overlay and for the end of
the overlay, respectively. See section Marker Insertion Types. If they
are both nil, the default, then the overlay extends to include
any text inserted at the beginning, but not text inserted at the end.
If front-advance is non-nil, text inserted at the
beginning of the overlay is excluded from the overlay. If
rear-advance is non-nil, text inserted at the end of the
overlay is included in the overlay.
This function returns the position at which overlay starts, as an integer.
This function returns the position at which overlay ends, as an integer.
This function returns the buffer that overlay belongs to. It
returns nil if overlay has been deleted.
This function deletes overlay. The overlay continues to exist as a Lisp object, and its property list is unchanged, but it ceases to be attached to the buffer it belonged to, and ceases to have any effect on display.
A deleted overlay is not permanently disconnected. You can give it a
position in a buffer again by calling move-overlay.
This function moves overlay to buffer, and places its bounds at start and end. Both arguments start and end must specify buffer positions; they may be integers or markers.
If buffer is omitted, overlay stays in the same buffer it was already associated with; if overlay was deleted, it goes into the current buffer.
The return value is overlay.
This is the only valid way to change the endpoints of an overlay. Do not try modifying the markers in the overlay by hand, as that fails to update other vital data structures and can cause some overlays to be “lost”.
This function removes all the overlays between start and end whose property name has the value value. It can move the endpoints of the overlays in the region, or split them.
If name is omitted or nil, it means to delete all overlays in
the specified region. If start and/or end are omitted or
nil, that means the beginning and end of the buffer respectively.
Therefore, (remove-overlays) removes all the overlays in the
current buffer.
This function returns a copy of overlay. The copy has the same endpoints and properties as overlay. However, the marker insertion type for the start of the overlay and for the end of the overlay are set to their default values (see section Marker Insertion Types).
Here are some examples:
;; Create an overlay. (setq foo (make-overlay 1 10)) ⇒ #<overlay from 1 to 10 in display.texi> (overlay-start foo) ⇒ 1 (overlay-end foo) ⇒ 10 (overlay-buffer foo) ⇒ #<buffer display.texi> ;; Give it a property we can check later. (overlay-put foo 'happy t) ⇒ t ;; Verify the property is present. (overlay-get foo 'happy) ⇒ t ;; Move the overlay. (move-overlay foo 5 20) ⇒ #<overlay from 5 to 20 in display.texi> (overlay-start foo) ⇒ 5 (overlay-end foo) ⇒ 20 ;; Delete the overlay. (delete-overlay foo) ⇒ nil ;; Verify it is deleted. foo ⇒ #<overlay in no buffer> ;; A deleted overlay has no position. (overlay-start foo) ⇒ nil (overlay-end foo) ⇒ nil (overlay-buffer foo) ⇒ nil ;; Undelete the overlay. (move-overlay foo 1 20) ⇒ #<overlay from 1 to 20 in display.texi> ;; Verify the results. (overlay-start foo) ⇒ 1 (overlay-end foo) ⇒ 20 (overlay-buffer foo) ⇒ #<buffer display.texi> ;; Moving and deleting the overlay does not change its properties. (overlay-get foo 'happy) ⇒ t
Emacs stores the overlays of each buffer in two lists, divided around an arbitrary “center position”. One list extends backwards through the buffer from that center position, and the other extends forwards from that center position. The center position can be anywhere in the buffer.
This function recenters the overlays of the current buffer around position pos. That makes overlay lookup faster for positions near pos, but slower for positions far away from pos.
A loop that scans the buffer forwards, creating overlays, can run
faster if you do (overlay-recenter (point-max)) first.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Overlay properties are like text properties in that the properties that alter how a character is displayed can come from either source. But in most respects they are different. See section Text Properties, for comparison.
Text properties are considered a part of the text; overlays and their properties are specifically considered not to be part of the text. Thus, copying text between various buffers and strings preserves text properties, but does not try to preserve overlays. Changing a buffer’s text properties marks the buffer as modified, while moving an overlay or changing its properties does not. Unlike text property changes, overlay property changes are not recorded in the buffer’s undo list.
Since more than one overlay can specify a property value for the same character, Emacs lets you specify a priority value of each overlay. In case two overlays have the same priority value, and one is nested in the other, then the inner one will have priority over the outer one. If neither is nested in the other then you should not make assumptions about which overlay will prevail.
These functions read and set the properties of an overlay:
This function returns the value of property prop recorded in
overlay, if any. If overlay does not record any value for
that property, but it does have a category property which is a
symbol, that symbol’s prop property is used. Otherwise, the value
is nil.
This function sets the value of property prop recorded in overlay to value. It returns value.
This returns a copy of the property list of overlay.
See also the function get-char-property which checks both
overlay properties and text properties for a given character.
See section Examining Text Properties.
Many overlay properties have special meanings; here is a table of them:
priorityThis property’s value determines the priority of the overlay.
If you want to specify a priority value, use either nil
(or zero), or a positive integer. Any other value has undefined behavior.
The priority matters when two or more overlays cover the same
character and both specify the same property; the one whose
priority value is larger overrides the other. For the
face property, the higher priority overlay’s value does not
completely override the other value; instead, its face attributes
override the face attributes of the lower priority face
property.
Currently, all overlays take priority over text properties.
Note that Emacs sometimes uses non-numeric priority values for some of
its internal overlays, so do not try to do arithmetic on the
priority of an overlay (unless it is one that you created). If you
need to put overlays in priority order, use the sorted argument
of overlays-at. See section Searching for Overlays.
windowIf the window property is non-nil, then the overlay
applies only on that window.
categoryIf an overlay has a category property, we call it the
category of the overlay. It should be a symbol. The properties
of the symbol serve as defaults for the properties of the overlay.
faceThis property controls the appearance of the text (see section Faces). The value of the property can be the following:
(keyword
value …), where each keyword is a face attribute
name and value is a value for that attribute.
(foreground-color . color-name)
or (background-color . color-name). This specifies the
foreground or background color, similar to (:foreground
color-name) or (:background color-name). This
form is supported for backward compatibility only, and should be
avoided.
mouse-faceThis property is used instead of face when the mouse is within
the range of the overlay. However, Emacs ignores all face attributes
from this property that alter the text size (e.g., :height,
:weight, and :slant). Those attributes are always the
same as in the unhighlighted text.
displayThis property activates various features that change the
way text is displayed. For example, it can make text appear taller
or shorter, higher or lower, wider or narrower, or replaced with an image.
See section The display Property.
help-echoIf an overlay has a help-echo property, then when you move the
mouse onto the text in the overlay, Emacs displays a help string in the
echo area, or in the tooltip window. For details see Text help-echo.
fieldConsecutive characters with the same field property constitute a
field. Some motion functions including forward-word and
beginning-of-line stop moving at a field boundary.
See section Defining and Using Fields.
modification-hooksThis property’s value is a list of functions to be called if any character within the overlay is changed or if text is inserted strictly within the overlay.
The hook functions are called both before and after each change. If the functions save the information they receive, and compare notes between calls, they can determine exactly what change has been made in the buffer text.
When called before a change, each function receives four arguments: the
overlay, nil, and the beginning and end of the text range to be
modified.
When called after a change, each function receives five arguments: the
overlay, t, the beginning and end of the text range just
modified, and the length of the pre-change text replaced by that range.
(For an insertion, the pre-change length is zero; for a deletion, that
length is the number of characters deleted, and the post-change
beginning and end are equal.)
If these functions modify the buffer, they should bind
inhibit-modification-hooks to t around doing so, to
avoid confusing the internal mechanism that calls these hooks.
Text properties also support the modification-hooks property,
but the details are somewhat different (see section Properties with Special Meanings).
insert-in-front-hooksThis property’s value is a list of functions to be called before and
after inserting text right at the beginning of the overlay. The calling
conventions are the same as for the modification-hooks functions.
insert-behind-hooksThis property’s value is a list of functions to be called before and
after inserting text right at the end of the overlay. The calling
conventions are the same as for the modification-hooks functions.
invisibleThe invisible property can make the text in the overlay
invisible, which means that it does not appear on the screen.
See section Invisible Text, for details.
intangibleThe intangible property on an overlay works just like the
intangible text property. See section Properties with Special Meanings, for details.
isearch-open-invisibleThis property tells incremental search how to make an invisible overlay visible, permanently, if the final match overlaps it. See section Invisible Text.
isearch-open-invisible-temporaryThis property tells incremental search how to make an invisible overlay visible, temporarily, during the search. See section Invisible Text.
before-stringThis property’s value is a string to add to the display at the beginning of the overlay. The string does not appear in the buffer in any sense—only on the screen.
after-stringThis property’s value is a string to add to the display at the end of the overlay. The string does not appear in the buffer in any sense—only on the screen.
line-prefixThis property specifies a display spec to prepend to each non-continuation line at display-time. See section Truncation.
wrap-prefixThis property specifies a display spec to prepend to each continuation line at display-time. See section Truncation.
evaporateIf this property is non-nil, the overlay is deleted automatically
if it becomes empty (i.e., if its length becomes zero). If you give
an empty overlay a non-nil evaporate property, that deletes
it immediately.
keymapIf this property is non-nil, it specifies a keymap for a portion of the
text. This keymap is used when the character after point is within the
overlay, and takes precedence over most other keymaps. See section Active Keymaps.
local-mapThe local-map property is similar to keymap but replaces the
buffer’s local map rather than augmenting existing keymaps. This also means it
has lower precedence than minor mode keymaps.
The keymap and local-map properties do not affect a
string displayed by the before-string, after-string, or
display properties. This is only relevant for mouse clicks and
other mouse events that fall on the string, since point is never on
the string. To bind special mouse events for the string, assign it a
keymap or local-map text property. See section Properties with Special Meanings.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This function returns a list of all the overlays that cover the character at
position pos in the current buffer. If sorted is non-nil,
the list is in decreasing order of priority, otherwise it is in no particular
order. An overlay contains position pos if it begins at or before
pos, and ends after pos.
To illustrate usage, here is a Lisp function that returns a list of the overlays that specify property prop for the character at point:
(defun find-overlays-specifying (prop)
(let ((overlays (overlays-at (point)))
found)
(while overlays
(let ((overlay (car overlays)))
(if (overlay-get overlay prop)
(setq found (cons overlay found))))
(setq overlays (cdr overlays)))
found))
This function returns a list of the overlays that overlap the region beg through end. “Overlap” means that at least one character is contained within the overlay and also contained within the specified region; however, empty overlays are included in the result if they are located at beg, strictly between beg and end, or at end when end denotes the position at the end of the buffer.
This function returns the buffer position of the next beginning or end
of an overlay, after pos. If there is none, it returns
(point-max).
This function returns the buffer position of the previous beginning or
end of an overlay, before pos. If there is none, it returns
(point-min).
As an example, here’s a simplified (and inefficient) version of the
primitive function next-single-char-property-change
(see section Text Property Search Functions). It searches forward from position
pos for the next position where the value of a given property
prop, as obtained from either overlays or text properties,
changes.
(defun next-single-char-property-change (position prop)
(save-excursion
(goto-char position)
(let ((propval (get-char-property (point) prop)))
(while (and (not (eobp))
(eq (get-char-property (point) prop) propval))
(goto-char (min (next-overlay-change (point))
(next-single-property-change (point) prop)))))
(point)))
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Since not all characters have the same width, these functions let you check the width of a character. See section Indentation Primitives, and Motion by Screen Lines, for related functions.
This function returns the width in columns of the character
char, if it were displayed in the current buffer (i.e., taking
into account the buffer’s display table, if any; see section Display Tables). The width of a tab character is usually tab-width
(see section Usual Display Conventions).
This function returns the width in columns of the string string, if it were displayed in the current buffer and the selected window.
This function returns the part of string that fits within width columns, as a new string.
If string does not reach width, then the result ends where string ends. If one multi-column character in string extends across the column width, that character is not included in the result. Thus, the result can fall short of width but cannot go beyond it.
The optional argument start-column specifies the starting column.
If this is non-nil, then the first start-column columns of
the string are omitted from the value. If one multi-column character in
string extends across the column start-column, that
character is not included.
The optional argument padding, if non-nil, is a padding
character added at the beginning and end of the result string, to extend
it to exactly width columns. The padding character is used at the
end of the result if it falls short of width. It is also used at
the beginning of the result if one multi-column character in
string extends across the column start-column.
If ellipsis is non-nil, it should be a string which will
replace the end of string (including any padding) if it extends
beyond width, unless the display width of string is equal
to or less than the display width of ellipsis. If
ellipsis is non-nil and not a string, it stands for
"...".
(truncate-string-to-width "\tab\t" 12 4)
⇒ "ab"
(truncate-string-to-width "\tab\t" 12 4 ?\s)
⇒ " ab "
The following function returns the size in pixels of text as if it were
displayed in a given window. This function is used by
fit-window-to-buffer (see section Resizing Windows) and
fit-frame-to-buffer (see section Frame Size And Position) to make a window
exactly as large as the text it contains.
This function returns the size of the text of window’s buffer in pixels. window must be a live window and defaults to the selected one. The return value is a cons of the maximum pixel-width of any text line and the maximum pixel-height of all text lines.
The optional argument from, if non-nil, specifies the first
text position to consider and defaults to the minimum accessible
position of the buffer. If from is t, it uses the minimum
accessible position that is not a newline character. The optional
argument to, if non-nil, specifies the last text position
to consider and defaults to the maximum accessible position of the
buffer. If to is t, it uses the maximum accessible
position that is not a newline character.
The optional argument x-limit, if non-nil, specifies the
maximum pixel-width that can be returned. x-limit nil or
omitted, means to use the pixel-width of window’s body
(see section Window Sizes); this is useful when the caller does not intend
to change the width of window. Otherwise, the caller should
specify here the maximum width window’s body may assume. Text
whose x-coordinate is beyond x-limit is ignored. Since
calculating the width of long lines can take some time, it’s always a
good idea to make this argument as small as needed; in particular, if
the buffer might contain long lines that will be truncated anyway.
The optional argument y-limit, if non-nil, specifies the
maximum pixel-height that can be returned. Text lines whose
y-coordinate is beyond y-limit are ignored. Since calculating the
pixel-height of a large buffer can take some time, it makes sense to
specify this argument; in particular, if the caller does not know the
size of the buffer.
The optional argument mode-and-header-line nil or omitted
means to not include the height of the mode- or header-line of
window in the return value. If it is either the symbol
mode-line or header-line, include only the height of that
line, if present, in the return value. If it is t, include the
height of both, if present, in the return value.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The total height of each display line consists of the height of the contents of the line, plus optional additional vertical line spacing above or below the display line.
The height of the line contents is the maximum height of any character or image on that display line, including the final newline if there is one. (A display line that is continued doesn’t include a final newline.) That is the default line height, if you do nothing to specify a greater height. (In the most common case, this equals the height of the default frame font.)
There are several ways to explicitly specify a larger line height, either by specifying an absolute height for the display line, or by specifying vertical space. However, no matter what you specify, the actual line height can never be less than the default.
A newline can have a line-height text or overlay property
that controls the total height of the display line ending in that
newline.
If the property value is t, the newline character has no
effect on the displayed height of the line—the visible contents
alone determine the height. This is useful for tiling small images
(or image slices) without adding blank areas between the images.
If the property value is a list of the form (height
total), that adds extra space below the display line.
First Emacs uses height as a height spec to control extra space
above the line; then it adds enough space below the line
to bring the total line height up to total. In this case, the
other ways to specify the line spacing are ignored.
Any other kind of property value is a height spec, which translates into a number—the specified line height. There are several ways to write a height spec; here’s how each of them translates into a number:
integerIf the height spec is a positive integer, the height value is that integer.
floatIf the height spec is a float, float, the numeric height value is float times the frame’s default line height.
(face . ratio)If the height spec is a cons of the format shown, the numeric height
is ratio times the height of face face. ratio can
be any type of number, or nil which means a ratio of 1.
If face is t, it refers to the current face.
(nil . ratio)If the height spec is a cons of the format shown, the numeric height is ratio times the height of the contents of the line.
Thus, any valid height spec determines the height in pixels, one way or another. If the line contents’ height is less than that, Emacs adds extra vertical space above the line to achieve the specified total height.
If you don’t specify the line-height property, the line’s
height consists of the contents’ height plus the line spacing.
There are several ways to specify the line spacing for different
parts of Emacs text.
On graphical terminals, you can specify the line spacing for all
lines in a frame, using the line-spacing frame parameter
(see section Layout Parameters). However, if the default value of
line-spacing is non-nil, it overrides the
frame’s line-spacing parameter. An integer specifies the
number of pixels put below lines. A floating-point number specifies
the spacing relative to the frame’s default line height.
You can specify the line spacing for all lines in a buffer via the
buffer-local line-spacing variable. An integer specifies
the number of pixels put below lines. A floating-point number
specifies the spacing relative to the default frame line height. This
overrides line spacings specified for the frame.
Finally, a newline can have a line-spacing text or overlay
property that overrides the default frame line spacing and the buffer
local line-spacing variable, for the display line ending in
that newline.
One way or another, these mechanisms specify a Lisp value for the spacing of each line. The value is a height spec, and it translates into a Lisp value as described above. However, in this case the numeric height value specifies the line spacing, rather than the line height.
On text terminals, the line spacing cannot be altered.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A face is a collection of graphical attributes for displaying text: font, foreground color, background color, optional underlining, etc. Faces control how Emacs displays text in buffers, as well as other parts of the frame such as the mode line.
One way to represent a face is as a property list of attributes,
like (:foreground "red" :weight bold). Such a list is called
an anonymous face. For example, you can assign an anonymous
face as the value of the face text property, and Emacs will
display the underlying text with the specified attributes.
See section Properties with Special Meanings.
More commonly, a face is referred to via a face name: a Lisp
symbol associated with a set of face attributes19. Named faces are
defined using the defface macro (see section Defining Faces).
Emacs comes with several standard named faces (see section Basic Faces).
Many parts of Emacs required named faces, and do not accept
anonymous faces. These include the functions documented in
Face Attribute Functions, and the variable font-lock-keywords
(see section Search-based Fontification). Unless otherwise stated, we
will use the term face to refer only to named faces.
This function returns a non-nil value if object is a
named face: a Lisp symbol or string which serves as a face name.
Otherwise, it returns nil.
| 37.12.1 Face Attributes | What is in a face? | |
| 37.12.2 Defining Faces | How to define a face. | |
| 37.12.3 Face Attribute Functions | Functions to examine and set face attributes. | |
| 37.12.4 Displaying Faces | How Emacs combines the faces specified for a character. | |
| 37.12.5 Face Remapping | Remapping faces to alternative definitions. | |
| 37.12.6 Functions for Working with Faces | How to define and examine faces. | |
| 37.12.7 Automatic Face Assignment | Hook for automatic face assignment. | |
| 37.12.8 Basic Faces | Faces that are defined by default. | |
| 37.12.9 Font Selection | Finding the best available font for a face. | |
| 37.12.10 Looking Up Fonts | Looking up the names of available fonts and information about them. | |
| 37.12.11 Fontsets | A fontset is a collection of fonts that handle a range of character sets. | |
| 37.12.12 Low-Level Font Representation | Lisp representation for character display fonts. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Face attributes determine the visual appearance of a face. The following table lists all the face attributes, their possible values, and their effects.
Apart from the values given below, each face attribute can have the
value unspecified. This special value means that the face
doesn’t specify that attribute directly. An unspecified
attribute tells Emacs to refer instead to a parent face (see the
description :inherit attribute below); or, failing that, to an
underlying face (see section Displaying Faces). The default face
must specify all attributes.
Some of these attributes are meaningful only on certain kinds of displays. If your display cannot handle a certain attribute, the attribute is ignored.
:familyFont family or fontset (a string). See Fonts in The GNU
Emacs Manual, for more information about font families. The function
font-family-list (see below) returns a list of available family
names. See section Fontsets, for information about fontsets.
:foundryThe name of the font foundry for the font family specified by
the :family attribute (a string). See Fonts in The
GNU Emacs Manual.
:widthRelative character width. This should be one of the symbols
ultra-condensed, extra-condensed, condensed,
semi-condensed, normal, semi-expanded,
expanded, extra-expanded, or ultra-expanded.
:heightThe height of the font. In the simplest case, this is an integer in units of 1/10 point.
The value can also be floating point or a function, which specifies the height relative to an underlying face (see section Displaying Faces). A floating-point value specifies the amount by which to scale the height of the underlying face. A function value is called with one argument, the height of the underlying face, and returns the height of the new face. If the function is passed an integer argument, it must return an integer.
The height of the default face must be specified using an integer; floating point and function values are not allowed.
:weightFont weight—one of the symbols (from densest to faintest)
ultra-bold, extra-bold, bold, semi-bold,
normal, semi-light, light, extra-light, or
ultra-light. On text terminals which support
variable-brightness text, any weight greater than normal is displayed
as extra bright, and any weight less than normal is displayed as
half-bright.
:slantFont slant—one of the symbols italic, oblique,
normal, reverse-italic, or reverse-oblique. On
text terminals that support variable-brightness text, slanted text is
displayed as half-bright.
:foregroundForeground color, a string. The value can be a system-defined color name, or a hexadecimal color specification. See section Color Names. On black-and-white displays, certain shades of gray are implemented by stipple patterns.
:distant-foregroundAlternative foreground color, a string. This is like :foreground
but the color is only used as a foreground when the background color is
near to the foreground that would have been used. This is useful for
example when marking text (i.e. the region face). If the text has a foreground
that is visible with the region face, that foreground is used.
If the foreground is near the region face background,
:distant-foreground is used instead so the text is readable.
:backgroundBackground color, a string. The value can be a system-defined color name, or a hexadecimal color specification. See section Color Names.
:underlineWhether or not characters should be underlined, and in what
way. The possible values of the :underline attribute are:
nilDon’t underline.
tUnderline with the foreground color of the face.
Underline in color color, a string specifying a color.
(:color color :style style)color is either a string, or the symbol foreground-color,
meaning the foreground color of the face. Omitting the attribute
:color means to use the foreground color of the face.
style should be a symbol line or wave, meaning to
use a straight or wavy line. Omitting the attribute :style
means to use a straight line.
:overlineWhether or not characters should be overlined, and in what color.
If the value is t, overlining uses the foreground color of the
face. If the value is a string, overlining uses that color. The
value nil means do not overline.
:strike-throughWhether or not characters should be strike-through, and in what
color. The value is used like that of :overline.
:boxWhether or not a box should be drawn around characters, its color, the
width of the box lines, and 3D appearance. Here are the possible
values of the :box attribute, and what they mean:
nilDon’t draw a box.
tDraw a box with lines of width 1, in the foreground color.
Draw a box with lines of width 1, in color color.
(:line-width width :color color :style style)This way you can explicitly specify all aspects of the box. The value width specifies the width of the lines to draw; it defaults to 1. A negative width -n means to draw a line of width n that occupies the space of the underlying text, thus avoiding any increase in the character height or width.
The value color specifies the color to draw with. The default is the foreground color of the face for simple boxes, and the background color of the face for 3D boxes.
The value style specifies whether to draw a 3D box. If it is
released-button, the box looks like a 3D button that is not being
pressed. If it is pressed-button, the box looks like a 3D button
that is being pressed. If it is nil or omitted, a plain 2D box
is used.
:inverse-videoWhether or not characters should be displayed in inverse video. The
value should be t (yes) or nil (no).
:stippleThe background stipple, a bitmap.
The value can be a string; that should be the name of a file containing
external-format X bitmap data. The file is found in the directories
listed in the variable x-bitmap-file-path.
Alternatively, the value can specify the bitmap directly, with a list
of the form (width height data). Here,
width and height specify the size in pixels, and
data is a string containing the raw bits of the bitmap, row by
row. Each row occupies (width + 7) / 8 consecutive bytes
in the string (which should be a unibyte string for best results).
This means that each row always occupies at least one whole byte.
If the value is nil, that means use no stipple pattern.
Normally you do not need to set the stipple attribute, because it is used automatically to handle certain shades of gray.
:fontThe font used to display the face. Its value should be a font object. See section Low-Level Font Representation, for information about font objects, font specs, and font entities.
When specifying this attribute using set-face-attribute
(see section Face Attribute Functions), you may also supply a font spec, a font
entity, or a string. Emacs converts such values to an appropriate
font object, and stores that font object as the actual attribute
value. If you specify a string, the contents of the string should be
a font name (see Fonts in The GNU Emacs Manual); if the
font name is an XLFD containing wildcards, Emacs chooses the first
font matching those wildcards. Specifying this attribute also changes
the values of the :family, :foundry, :width,
:height, :weight, and :slant attributes.
:inheritThe name of a face from which to inherit attributes, or a list of face names. Attributes from inherited faces are merged into the face like an underlying face would be, with higher priority than underlying faces (see section Displaying Faces). If a list of faces is used, attributes from faces earlier in the list override those from later faces.
This function returns a list of available font family names. The
optional argument frame specifies the frame on which the text is
to be displayed; if it is nil, the selected frame is used.
This variable specifies the minimum distance between the baseline and the underline, in pixels, when displaying underlined text.
This variable specifies a list of directories for searching
for bitmap files, for the :stipple attribute.
This returns t if object is a valid bitmap specification,
suitable for use with :stipple (see above). It returns
nil otherwise.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The usual way to define a face is through the defface macro.
This macro associates a face name (a symbol) with a default face
spec. A face spec is a construct which specifies what attributes a
face should have on any given terminal; for example, a face spec might
specify one foreground color on high-color terminals, and a different
foreground color on low-color terminals.
People are sometimes tempted to create a variable whose value is a
face name. In the vast majority of cases, this is not necessary; the
usual procedure is to define a face with defface, and then use
its name directly.
This macro declares face as a named face whose default face spec
is given by spec. You should not quote the symbol face,
and it should not end in ‘-face’ (that would be redundant). The
argument doc is a documentation string for the face. The
additional keyword arguments have the same meanings as in
defgroup and defcustom (see section Common Item Keywords).
If face already has a default face spec, this macro does nothing.
The default face spec determines face’s appearance when no customizations are in effect (see section Customization Settings). If face has already been customized (via Custom themes or via customizations read from the init file), its appearance is determined by the custom face spec(s), which override the default face spec spec. However, if the customizations are subsequently removed, the appearance of face will again be determined by its default face spec.
As an exception, if you evaluate a defface form with
C-M-x in Emacs Lisp mode (eval-defun), a special feature
of eval-defun overrides any custom face specs on the face,
causing the face to reflect exactly what the defface says.
The spec argument is a face spec, which states how the face should appear on different kinds of terminals. It should be an alist whose elements each have the form
(display . plist)
display specifies a class of terminals (see below). plist
is a property list of face attributes and their values, specifying how
the face appears on such terminals. For backward compatibility, you
can also write an element as (display plist).
The display part of an element of spec determines which terminals the element matches. If more than one element of spec matches a given terminal, the first element that matches is the one used for that terminal. There are three possibilities for display:
defaultThis element of spec doesn’t match any terminal; instead, it specifies defaults that apply to all terminals. This element, if used, must be the first element of spec. Each of the following elements can override any or all of these defaults.
tThis element of spec matches all terminals. Therefore, any
subsequent elements of spec are never used. Normally t
is used in the last (or only) element of spec.
If display is a list, each element should have the form
(characteristic value…). Here
characteristic specifies a way of classifying terminals, and the
values are possible classifications which display should
apply to. Here are the possible values of characteristic:
typeThe kind of window system the terminal uses—either graphic
(any graphics-capable display), x, pc (for the MS-DOS
console), w32 (for MS Windows 9X/NT/2K/XP), or tty (a
non-graphics-capable display). See section window-system.
classWhat kinds of colors the terminal supports—either color,
grayscale, or mono.
backgroundThe kind of background—either light or dark.
min-colorsAn integer that represents the minimum number of colors the terminal
should support. This matches a terminal if its
display-color-cells value is at least the specified integer.
supportsWhether or not the terminal can display the face attributes given in value… (see section Face Attributes). See Display Face Attribute Testing, for more information on exactly how this testing is done.
If an element of display specifies more than one value for a given characteristic, any of those values is acceptable. If display has more than one element, each element should specify a different characteristic; then each characteristic of the terminal must match one of the values specified for it in display.
For example, here’s the definition of the standard face
highlight:
(defface highlight
'((((class color) (min-colors 88) (background light))
:background "darkseagreen2")
(((class color) (min-colors 88) (background dark))
:background "darkolivegreen")
(((class color) (min-colors 16) (background light))
:background "darkseagreen2")
(((class color) (min-colors 16) (background dark))
:background "darkolivegreen")
(((class color) (min-colors 8))
:background "green" :foreground "black")
(t :inverse-video t))
"Basic face for highlighting."
:group 'basic-faces)
Internally, Emacs stores each face’s default spec in its
face-defface-spec symbol property (see section Symbol Properties).
The saved-face property stores any face spec saved by the user
using the customization buffer; the customized-face property
stores the face spec customized for the current session, but not
saved; and the theme-face property stores an alist associating
the active customization settings and Custom themes with the face
specs for that face. The face’s documentation string is stored in the
face-documentation property.
Normally, a face is declared just once, using defface, and
any further changes to its appearance are applied using the Customize
framework (e.g., via the Customize user interface or via the
custom-set-faces function; see section Applying Customizations), or
by face remapping (see section Face Remapping). In the rare event that
you need to change a face spec directly from Lisp, you can use the
face-spec-set function.
This function applies spec as a face spec for face.
spec should be a face spec, as described in the above
documentation for defface.
This function also defines face as a valid face name if it is not already one, and (re)calculates its attributes on existing frames.
The argument spec-type determines which spec to set. If it is
nil or face-override-spec, this function sets the
override spec, which overrides over all other face specs on
face. If it is customized-face or saved-face,
this function sets the customized spec or the saved custom spec. If
it is face-defface-spec, this function sets the default face
spec (the same one set by defface). If it is reset,
this function clears out all customization specs and override specs
from face (in this case, the value of spec is ignored).
Any other value of spec-type is reserved for internal use.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes functions for directly accessing and modifying the attributes of a named face.
This function returns the value of the attribute attribute for face on frame.
If frame is nil, that means the selected frame
(see section Input Focus). If frame is t, this function
returns the value of the specified attribute for newly-created frames
(this is normally unspecified, unless you have specified some
value using set-face-attribute; see below).
If inherit is nil, only attributes directly defined by
face are considered, so the return value may be
unspecified, or a relative value. If inherit is
non-nil, face’s definition of attribute is merged
with the faces specified by its :inherit attribute; however the
return value may still be unspecified or relative. If
inherit is a face or a list of faces, then the result is further
merged with that face (or faces), until it becomes specified and
absolute.
To ensure that the return value is always specified and absolute, use
a value of default for inherit; this will resolve any
unspecified or relative values by merging with the default face
(which is always completely specified).
For example,
(face-attribute 'bold :weight)
⇒ bold
This function returns non-nil if value, when used as the
value of the face attribute attribute, is relative. This means
it would modify, rather than completely override, any value that comes
from a subsequent face in the face list or that is inherited from
another face.
unspecified is a relative value for all attributes. For
:height, floating point and function values are also relative.
For example:
(face-attribute-relative-p :height 2.0)
⇒ t
This function returns an alist of attributes of face. The
elements of the result are name-value pairs of the form
(attr-name . attr-value). Optional argument
frame specifies the frame whose definition of face to
return; if omitted or nil, the returned value describes the
default attributes of face for newly created frames.
If value1 is a relative value for the face attribute attribute, returns it merged with the underlying value value2; otherwise, if value1 is an absolute value for the face attribute attribute, returns value1 unchanged.
Normally, Emacs uses the face specs of each face to automatically
calculate its attributes on each frame (see section Defining Faces). The
function set-face-attribute can override this calculation by
directly assigning attributes to a face, either on a specific frame or
for all frames. This function is mostly intended for internal usage.
This function sets one or more attributes of face for frame. The attributes specifies in this way override the face spec(s) belonging to face.
The extra arguments arguments specify the attributes to set, and
the values for them. They should consist of alternating attribute
names (such as :family or :underline) and values. Thus,
(set-face-attribute 'foo nil :weight 'bold :slant 'italic)
sets the attribute :weight to bold and the attribute
:slant to italic.
If frame is t, this function sets the default attributes
for newly created frames. If frame is nil, this function
sets the attributes for all existing frames, as well as for newly
created frames.
The following commands and functions mostly provide compatibility
with old versions of Emacs. They work by calling
set-face-attribute. Values of t and nil for
their frame argument are handled just like
set-face-attribute and face-attribute. The commands
read their arguments using the minibuffer, if called interactively.
These set the :foreground attribute (or :background
attribute, respectively) of face to color.
This sets the :stipple attribute of face to
pattern.
This sets the :font attribute of face to font.
This sets the :weight attribute of face to normal
if bold-p is nil, and to bold otherwise.
This sets the :slant attribute of face to normal if
italic-p is nil, and to italic otherwise.
This sets the :underline attribute of face to
underline.
This sets the :inverse-video attribute of face to
inverse-video-p.
This swaps the foreground and background colors of face face.
The following functions examine the attributes of a face. They
mostly provide compatibility with old versions of Emacs. If you don’t
specify frame, they refer to the selected frame; t refers
to the default data for new frames. They return unspecified if
the face doesn’t define any value for that attribute. If
inherit is nil, only an attribute directly defined by the
face is returned. If inherit is non-nil, any faces
specified by its :inherit attribute are considered as well, and
if inherit is a face or a list of faces, then they are also
considered, until a specified attribute is found. To ensure that the
return value is always specified, use a value of default for
inherit.
This function returns the name of the font of face face.
These functions return the foreground color (or background color, respectively) of face face, as a string.
This function returns the name of the background stipple pattern of face
face, or nil if it doesn’t have one.
This function returns a non-nil value if the :weight
attribute of face is bolder than normal (i.e., one of
semi-bold, bold, extra-bold, or
ultra-bold). Otherwise, it returns nil.
This function returns a non-nil value if the :slant
attribute of face is italic or oblique, and
nil otherwise.
This function returns non-nil if face face specifies
a non-nil :underline attribute.
This function returns non-nil if face face specifies
a non-nil :inverse-video attribute.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When Emacs displays a given piece of text, the visual appearance of the text may be determined by faces drawn from different sources. If these various sources together specify more than one face for a particular character, Emacs merges the attributes of the various faces. Here is the order in which Emacs merges the faces, from highest to lowest priority:
region face. See Standard Faces in The GNU Emacs
Manual.
nil face
property, Emacs applies the face(s) specified by that property. If
the overlay has a mouse-face property and the mouse is “near
enough” to the overlay, Emacs applies the face or face attributes
specified by the mouse-face property instead. See section Overlay Properties.
When multiple overlays cover one character, an overlay with higher priority overrides those with lower priority. See section Overlays.
face or mouse-face property,
Emacs applies the specified faces and face attributes. See section Properties with Special Meanings. (This is how Font Lock mode faces are applied.
See section Font Lock Mode.)
mode-line face. For the mode line of a
non-selected window, Emacs applies the mode-line-inactive face.
For a header line, Emacs applies the header-line face.
default face.
At each stage, if a face has a valid :inherit attribute,
Emacs treats any attribute with an unspecified value as having
the corresponding value drawn from the parent face(s). see section Face Attributes. Note that the parent face(s) may also leave the
attribute unspecified; in that case, the attribute remains unspecified
at the next level of face merging.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The variable face-remapping-alist is used for buffer-local or
global changes in the appearance of a face. For instance, it is used
to implement the text-scale-adjust command (see Text
Scale in The GNU Emacs Manual).
The value of this variable is an alist whose elements have the form
(face . remapping). This causes Emacs to display
any text having the face face with remapping, rather than
the ordinary definition of face.
remapping may be any face spec suitable for a face text
property: either a face (i.e., a face name or a property list of
attribute/value pairs), or a list of faces. For details, see the
description of the face text property in Properties with Special Meanings. remapping serves as the complete specification for
the remapped face—it replaces the normal definition of face,
instead of modifying it.
If face-remapping-alist is buffer-local, its local value takes
effect only within that buffer.
Note: face remapping is non-recursive. If remapping references
the same face name face, either directly or via the
:inherit attribute of some other face in remapping, that
reference uses the normal definition of face. For instance, if
the mode-line face is remapped using this entry in
face-remapping-alist:
(mode-line italic mode-line)
then the new definition of the mode-line face inherits from the
italic face, and the normal (non-remapped) definition of
mode-line face.
The following functions implement a higher-level interface to
face-remapping-alist. Most Lisp code should use these
functions instead of setting face-remapping-alist directly, to
avoid trampling on remappings applied elsewhere. These functions are
intended for buffer-local remappings, so they all make
face-remapping-alist buffer-local as a side-effect. They manage
face-remapping-alist entries of the form
(face relative-spec-1 relative-spec-2 ... base-spec)
where, as explained above, each of the relative-spec-N and
base-spec is either a face name, or a property list of
attribute/value pairs. Each of the relative remapping entries,
relative-spec-N, is managed by the
face-remap-add-relative and face-remap-remove-relative
functions; these are intended for simple modifications like changing
the text size. The base remapping entry, base-spec, has
the lowest priority and is managed by the face-remap-set-base
and face-remap-reset-base functions; it is intended for major
modes to remap faces in the buffers they control.
This function adds the face spec in specs as relative remappings for face face in the current buffer. The remaining arguments, specs, should form either a list of face names, or a property list of attribute/value pairs.
The return value is a Lisp object that serves as a “cookie”; you can
pass this object as an argument to face-remap-remove-relative
if you need to remove the remapping later.
;; Remap the `escape-glyph' face into a combination ;; of the `highlight' and `italic' faces: (face-remap-add-relative 'escape-glyph 'highlight 'italic) ;; Increase the size of the `default' face by 50%: (face-remap-add-relative 'default :height 1.5)
This function removes a relative remapping previously added by
face-remap-add-relative. cookie should be the Lisp
object returned by face-remap-add-relative when the remapping
was added.
This function sets the base remapping of face in the current
buffer to specs. If specs is empty, the default base
remapping is restored, similar to calling face-remap-reset-base
(see below); note that this is different from specs containing a
single value nil, which has the opposite result (the global
definition of face is ignored).
This overwrites the default base-spec, which inherits the global face definition, so it is up to the caller to add such inheritance if so desired.
This function sets the base remapping of face to its default value, which inherits from face’s global definition.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here are additional functions for creating and working with faces.
This function returns a list of all defined face names.
This function returns the face number of face face. This is a number that uniquely identifies a face at low levels within Emacs. It is seldom necessary to refer to a face by its face number.
This function returns the documentation string of face face, or
nil if none was specified for it.
This returns t if the faces face1 and face2 have the
same attributes for display.
This returns non-nil if the face face displays
differently from the default face.
A face alias provides an equivalent name for a face. You can
define a face alias by giving the alias symbol the face-alias
property, with a value of the target face name. The following example
makes modeline an alias for the mode-line face.
(put 'modeline 'face-alias 'mode-line)
This macro defines obsolete-face as an alias for
current-face, and also marks it as obsolete, indicating that it
may be removed in future. when should be a string indicating
when obsolete-face was made obsolete (usually a version number
string).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This hook is used for automatically assigning faces to text in the buffer. It is part of the implementation of Jit-Lock mode, used by Font-Lock.
This variable holds a list of functions that are called by Emacs
redisplay as needed, just before doing redisplay. They are called even
when Font Lock Mode isn’t enabled. When Font Lock Mode is enabled, this
variable usually holds just one function, jit-lock-function.
The functions are called in the order listed, with one argument, a buffer position pos. Collectively they should attempt to assign faces to the text in the current buffer starting at pos.
The functions should record the faces they assign by setting the
face property. They should also add a non-nil
fontified property to all the text they have assigned faces to.
That property tells redisplay that faces have been assigned to that text
already.
It is probably a good idea for the functions to do nothing if the
character after pos already has a non-nil fontified
property, but this is not required. If one function overrides the
assignments made by a previous one, the properties after the last
function finishes are the ones that really matter.
For efficiency, we recommend writing these functions so that they usually assign faces to around 400 to 600 characters at each call.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If your Emacs Lisp program needs to assign some faces to text, it is often a good idea to use certain existing faces or inherit from them, rather than defining entirely new faces. This way, if other users have customized the basic faces to give Emacs a certain look, your program will “fit in” without additional customization.
Some of the basic faces defined in Emacs are listed below. In addition to these, you might want to make use of the Font Lock faces for syntactic highlighting, if highlighting is not already handled by Font Lock mode, or if some Font Lock faces are not in use. See section Faces for Font Lock.
defaultThe default face, whose attributes are all specified. All other faces implicitly inherit from it: any unspecified attribute defaults to the attribute on this face (see section Face Attributes).
bolditalicbold-italicunderlinefixed-pitchvariable-pitchThese have the attributes indicated by their names (e.g., bold
has a bold :weight attribute), with all other attributes
unspecified (and so given by default).
shadowFor “dimmed out” text. For example, it is used for the ignored part of a filename in the minibuffer (see Minibuffers for File Names in The GNU Emacs Manual).
linklink-visitedFor clickable text buttons that send the user to a different buffer or “location”.
highlightFor stretches of text that should temporarily stand out. For example,
it is commonly assigned to the mouse-face property for cursor
highlighting (see section Properties with Special Meanings).
matchFor text matching a search command.
errorwarningsuccessFor text concerning errors, warnings, or successes. For example, these are used for messages in *Compilation* buffers.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Before Emacs can draw a character on a graphical display, it must
select a font for that character20. See Fonts in The GNU Emacs Manual. Normally,
Emacs automatically chooses a font based on the faces assigned to that
character—specifically, the face attributes :family,
:weight, :slant, and :width (see section Face Attributes). The choice of font also depends on the character to be
displayed; some fonts can only display a limited set of characters.
If no available font exactly fits the requirements, Emacs looks for
the closest matching font. The variables in this section
control how Emacs makes this selection.
If a given family is specified but does not exist, this variable specifies alternative font families to try. Each element should have this form:
(family alternate-families…)
If family is specified but not available, Emacs will try the other families given in alternate-families, one by one, until it finds a family that does exist.
If there is no font that exactly matches all desired face attributes
(:width, :height, :weight, and :slant),
this variable specifies the order in which these attributes should be
considered when selecting the closest matching font. The value should
be a list containing those four attribute symbols, in order of
decreasing importance. The default is (:width :height :weight
:slant).
Font selection first finds the best available matches for the first attribute in the list; then, among the fonts which are best in that way, it searches for the best matches in the second attribute, and so on.
The attributes :weight and :width have symbolic values in
a range centered around normal. Matches that are more extreme
(farther from normal) are somewhat preferred to matches that are
less extreme (closer to normal); this is designed to ensure that
non-normal faces contrast with normal ones, whenever possible.
One example of a case where this variable makes a difference is when the
default font has no italic equivalent. With the default ordering, the
italic face will use a non-italic font that is similar to the
default one. But if you put :slant before :height, the
italic face will use an italic font, even if its height is not
quite right.
This variable lets you specify alternative font registries to try, if a given registry is specified and doesn’t exist. Each element should have this form:
(registry alternate-registries…)
If registry is specified but not available, Emacs will try the other registries given in alternate-registries, one by one, until it finds a registry that does exist.
Emacs can make use of scalable fonts, but by default it does not use them.
This variable controls which scalable fonts to use. A value of
nil, the default, means do not use scalable fonts. t
means to use any scalable font that seems appropriate for the text.
Otherwise, the value must be a list of regular expressions. Then a scalable font is enabled for use if its name matches any regular expression in the list. For example,
(setq scalable-fonts-allowed '("iso10646-1$"))
allows the use of scalable fonts with registry iso10646-1.
This variable specifies scaling for certain faces. Its value should be a list of elements of the form
(fontname-regexp . scale-factor)
If fontname-regexp matches the font name that is about to be used, this says to choose a larger similar font according to the factor scale-factor. You would use this feature to normalize the font size if certain fonts are bigger or smaller than their nominal heights and widths would suggest.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This function returns a list of available font names that match name. name should be a string containing a font name in either the Fontconfig, GTK, or XLFD format (see Fonts in The GNU Emacs Manual). Within an XLFD string, wildcard characters may be used: the ‘*’ character matches any substring, and the ‘?’ character matches any single character. Case is ignored when matching font names.
If the optional arguments reference-face and frame are specified, the returned list includes only fonts that are the same size as reference-face (a face name) currently is on the frame frame.
The optional argument maximum sets a limit on how many fonts to
return. If it is non-nil, then the return value is truncated
after the first maximum matching fonts. Specifying a small
value for maximum can make this function much faster, in cases
where many fonts match the pattern.
The optional argument width specifies a desired font width. If
it is non-nil, the function only returns those fonts whose
characters are (on average) width times as wide as
reference-face.
This function returns a list describing the available fonts for family
family on frame. If family is omitted or nil,
this list applies to all families, and therefore, it contains all
available fonts. Otherwise, family must be a string; it may
contain the wildcards ‘?’ and ‘*’.
The list describes the display that frame is on; if frame is
omitted or nil, it applies to the selected frame’s display
(see section Input Focus).
Each element in the list is a vector of the following form:
[family width point-size weight slant fixed-p full registry-and-encoding]
The first five elements correspond to face attributes; if you specify these attributes for a face, it will use this font.
The last three elements give additional information about the font.
fixed-p is non-nil if the font is fixed-pitch.
full is the full name of the font, and
registry-and-encoding is a string giving the registry and
encoding of the font.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A fontset is a list of fonts, each assigned to a range of character codes. An individual font cannot display the whole range of characters that Emacs supports, but a fontset can. Fontsets have names, just as fonts do, and you can use a fontset name in place of a font name when you specify the “font” for a frame or a face. Here is information about defining a fontset under Lisp program control.
This function defines a new fontset according to the specification string fontset-spec. The string should have this format:
fontpattern, [charset:font]…
Whitespace characters before and after the commas are ignored.
The first part of the string, fontpattern, should have the form of a standard X font name, except that the last two fields should be ‘fontset-alias’.
The new fontset has two names, one long and one short. The long name is
fontpattern in its entirety. The short name is
‘fontset-alias’. You can refer to the fontset by either
name. If a fontset with the same name already exists, an error is
signaled, unless noerror is non-nil, in which case this
function does nothing.
If optional argument style-variant-p is non-nil, that says
to create bold, italic and bold-italic variants of the fontset as well.
These variant fontsets do not have a short name, only a long one, which
is made by altering fontpattern to indicate the bold and/or italic
status.
The specification string also says which fonts to use in the fontset. See below for the details.
The construct ‘charset:font’ specifies which font to use (in this fontset) for one particular character set. Here, charset is the name of a character set, and font is the font to use for that character set. You can use this construct any number of times in the specification string.
For the remaining character sets, those that you don’t specify explicitly, Emacs chooses a font based on fontpattern: it replaces ‘fontset-alias’ with a value that names one character set. For the ASCII character set, ‘fontset-alias’ is replaced with ‘ISO8859-1’.
In addition, when several consecutive fields are wildcards, Emacs collapses them into a single wildcard. This is to prevent use of auto-scaled fonts. Fonts made by scaling larger fonts are not usable for editing, and scaling a smaller font is not useful because it is better to use the smaller font in its own size, which Emacs does.
Thus if fontpattern is this,
-*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24
the font specification for ASCII characters would be this:
-*-fixed-medium-r-normal-*-24-*-ISO8859-1
and the font specification for Chinese GB2312 characters would be this:
-*-fixed-medium-r-normal-*-24-*-gb2312*-*
You may not have any Chinese font matching the above font specification. Most X distributions include only Chinese fonts that have ‘song ti’ or ‘fangsong ti’ in the family field. In such a case, ‘Fontset-n’ can be specified as below:
Emacs.Fontset-0: -*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24,\
chinese-gb2312:-*-*-medium-r-normal-*-24-*-gb2312*-*
Then, the font specifications for all but Chinese GB2312 characters have ‘fixed’ in the family field, and the font specification for Chinese GB2312 characters has a wild card ‘*’ in the family field.
This function modifies the existing fontset name to use the font matching with font-spec for the character character.
If name is nil, this function modifies the fontset of the
selected frame or that of frame if frame is not
nil.
If name is t, this function modifies the default
fontset, whose short name is ‘fontset-default’.
character may be a cons; (from . to), where
from and to are character codepoints. In that case, use
font-spec for all characters in the range from and to
(inclusive).
character may be a charset. In that case, use font-spec for all character in the charsets.
character may be a script name. In that case, use font-spec for all character in the charsets.
font-spec may be a cons; (family . registry),
where family is a family name of a font (possibly including a
foundry name at the head), registry is a registry name of a font
(possibly including an encoding name at the tail).
font-spec may be a font name string.
The optional argument add, if non-nil, specifies how to
add font-spec to the font specifications previously set. If it
is prepend, font-spec is prepended. If it is
append, font-spec is appended. By default,
font-spec overrides the previous settings.
For instance, this changes the default fontset to use a font of which
family name is ‘Kochi Gothic’ for all characters belonging to
the charset japanese-jisx0208.
(set-fontset-font t 'japanese-jisx0208
(font-spec :family "Kochi Gothic"))
This function returns t if Emacs ought to be able to display
char. More precisely, if the selected frame’s fontset has a
font to display the character set that char belongs to.
Fontsets can specify a font on a per-character basis; when the fontset does that, this function’s value may not be accurate.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Normally, it is not necessary to manipulate fonts directly. In case you need to do so, this section explains how.
In Emacs Lisp, fonts are represented using three different Lisp object types: font objects, font specs, and font entities.
Return t if object is a font object, font spec, or font
entity. Otherwise, return nil.
The optional argument type, if non-nil, determines the
exact type of Lisp object to check for. In that case, type
should be one of font-object, font-spec, or
font-entity.
A font object is a Lisp object that represents a font that Emacs has opened. Font objects cannot be modified in Lisp, but they can be inspected.
Return the font object that is being used to display the character at
position position in the window window. If window
is nil, it defaults to the selected window. If string is
nil, position specifies a position in the current buffer;
otherwise, string should be a string, and position
specifies a position in that string.
A font spec is a Lisp object that contains a set of specifications that can be used to find a font. More than one font may match the specifications in a font spec.
Return a new font spec using the specifications in arguments,
which should come in property-value pairs. The possible
specifications are as follows:
:nameThe font name (a string), in either XLFD, Fontconfig, or GTK format. See Fonts in The GNU Emacs Manual.
:family:foundry:weight:slant:widthThese have the same meanings as the face attributes of the same name. See section Face Attributes.
:sizeThe font size—either a non-negative integer that specifies the pixel size, or a floating-point number that specifies the point size.
:adstyleAdditional typographic style information for the font, such as ‘sans’. The value should be a string or a symbol.
:registryThe charset registry and encoding of the font, such as ‘iso8859-1’. The value should be a string or a symbol.
:scriptThe script that the font must support (a symbol).
:otfThe font must be an OpenType font that supports these OpenType features, provided Emacs is compiled with support for ‘libotf’ (a library for performing complex text layout in certain scripts). The value must be a list of the form
(script-tag langsys-tag gsub gpos)
where script-tag is the OpenType script tag symbol;
langsys-tag is the OpenType language system tag symbol, or
nil to use the default language system; gsub is a list
of OpenType GSUB feature tag symbols, or nil if none is
required; and gpos is a list of OpenType GPOS feature tag
symbols, or nil if none is required. If gsub or
gpos is a list, a nil element in that list means that
the font must not match any of the remaining tag symbols. The
gpos element may be omitted.
Set the font property property in the font-spec font-spec to value.
A font entity is a reference to a font that need not be open. Its properties are intermediate between a font object and a font spec: like a font object, and unlike a font spec, it refers to a single, specific font. Unlike a font object, creating a font entity does not load the contents of that font into computer memory. Emacs may open multiple font objects of different sizes from a single font entity referring to a scalable font.
This function returns a font entity that best matches the font spec
font-spec on frame frame. If frame is nil,
it defaults to the selected frame.
This function returns a list of all font entities that match the font spec font-spec.
The optional argument frame, if non-nil, specifies the
frame on which the fonts are to be displayed. The optional argument
num, if non-nil, should be an integer that specifies the
maximum length of the returned list. The optional argument
prefer, if non-nil, should be another font spec, which is
used to control the order of the returned list; the returned font
entities are sorted in order of decreasing “closeness” to that font
spec.
If you call set-face-attribute and pass a font spec, font
entity, or font name string as the value of the :font
attribute, Emacs opens the best “matching” font that is available
for display. It then stores the corresponding font object as the
actual value of the :font attribute for that face.
The following functions can be used to obtain information about a font. For these functions, the font argument can be a font object, a font entity, or a font spec.
This function returns the value of the font property property for font.
If font is a font spec and the font spec does not specify
property, the return value is nil. If font is a
font object or font entity, the value for the :script property
may be a list of scripts supported by the font.
This function returns a list of face attributes corresponding to
font. The optional argument frame specifies the frame on
which the font is to be displayed. If it is nil, the selected
frame is used. The return value has the form
(:family family :height height :weight weight :slant slant :width width)
where the values of family, height, weight, slant, and width are face attribute values. Some of these key-attribute pairs may be omitted from the list if they are not specified by font.
This function returns the XLFD (X Logical Font Descriptor), a string,
matching font. See Fonts in The GNU Emacs Manual, for
information about XLFDs. If the name is too long for an XLFD (which
can contain at most 255 characters), the function returns nil.
If the optional argument fold-wildcards is non-nil,
consecutive wildcards in the XLFD are folded into one.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
On graphical displays, Emacs draws fringes next to each window: thin vertical strips down the sides which can display bitmaps indicating truncation, continuation, horizontal scrolling, and so on.
| 37.13.1 Fringe Size and Position | Specifying where to put the window fringes. | |
| 37.13.2 Fringe Indicators | Displaying indicator icons in the window fringes. | |
| 37.13.3 Fringe Cursors | Displaying cursors in the right fringe. | |
| 37.13.4 Fringe Bitmaps | Specifying bitmaps for fringe indicators. | |
| 37.13.5 Customizing Fringe Bitmaps | Specifying your own bitmaps to use in the fringes. | |
| 37.13.6 The Overlay Arrow | Display of an arrow to indicate position. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The following buffer-local variables control the position and width of fringes in windows showing that buffer.
The fringes normally appear between the display margins and the window
text. If the value is non-nil, they appear outside the display
margins. See section Displaying in the Margins.
This variable, if non-nil, specifies the width of the left
fringe in pixels. A value of nil means to use the left fringe
width from the window’s frame.
This variable, if non-nil, specifies the width of the right
fringe in pixels. A value of nil means to use the right fringe
width from the window’s frame.
Any buffer which does not specify values for these variables uses
the values specified by the left-fringe and right-fringe
frame parameters (see section Layout Parameters).
The above variables actually take effect via the function
set-window-buffer (see section Buffers and Windows), which calls
set-window-fringes as a subroutine. If you change one of these
variables, the fringe display is not updated in existing windows
showing the buffer, unless you call set-window-buffer again in
each affected window. You can also use set-window-fringes to
control the fringe display in individual windows.
This function sets the fringe widths of window window.
If window is nil, the selected window is used.
The argument left specifies the width in pixels of the left
fringe, and likewise right for the right fringe. A value of
nil for either one stands for the default width. If
outside-margins is non-nil, that specifies that fringes
should appear outside of the display margins.
This function returns information about the fringes of a window
window. If window is omitted or nil, the selected
window is used. The value has the form (left-width
right-width outside-margins).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Fringe indicators are tiny icons displayed in the window fringe to indicate truncated or continued lines, buffer boundaries, etc.
When this is non-nil, Emacs displays a special glyph in the
fringe of each empty line at the end of the buffer, on graphical
displays. See section Fringes. This variable is automatically
buffer-local in every buffer.
This buffer-local variable controls how the buffer boundaries and window scrolling are indicated in the window fringes.
Emacs can indicate the buffer boundaries—that is, the first and last line in the buffer—with angle icons when they appear on the screen. In addition, Emacs can display an up-arrow in the fringe to show that there is text above the screen, and a down-arrow to show there is text below the screen.
There are three kinds of basic values:
nilDon’t display any of these fringe icons.
leftDisplay the angle icons and arrows in the left fringe.
rightDisplay the angle icons and arrows in the right fringe.
Display the angle icons in the left fringe and don’t display the arrows.
Otherwise the value should be an alist that specifies which fringe
indicators to display and where. Each element of the alist should
have the form (indicator . position). Here,
indicator is one of top, bottom, up,
down, and t (which covers all the icons not yet
specified), while position is one of left, right
and nil.
For example, ((top . left) (t . right)) places the top angle
bitmap in left fringe, and the bottom angle bitmap as well as both
arrow bitmaps in right fringe. To show the angle bitmaps in the left
fringe, and no arrow bitmaps, use ((top . left) (bottom . left)).
This buffer-local variable specifies the mapping from logical fringe
indicators to the actual bitmaps displayed in the window fringes. The
value is an alist of elements (indicator
. bitmaps), where indicator specifies a logical indicator
type and bitmaps specifies the fringe bitmaps to use for that
indicator.
Each indicator should be one of the following symbols:
truncation, continuation.Used for truncation and continuation lines.
up, down, top, bottom, top-bottomUsed when indicate-buffer-boundaries is non-nil:
up and down indicate a buffer boundary lying above or
below the window edge; top and bottom indicate the
topmost and bottommost buffer text line; and top-bottom
indicates where there is just one line of text in the buffer.
empty-lineUsed to indicate empty lines when indicate-empty-lines is
non-nil.
overlay-arrowUsed for overlay arrows (see section The Overlay Arrow).
Each bitmaps value may be a list of symbols (left
right [left1 right1]). The left and
right symbols specify the bitmaps shown in the left and/or right
fringe, for the specific indicator. left1 and right1 are
specific to the bottom and top-bottom indicators, and
are used to indicate that the last text line has no final newline.
Alternatively, bitmaps may be a single symbol which is used in
both left and right fringes.
See section Fringe Bitmaps, for a list of standard bitmap symbols and how
to define your own. In addition, nil represents the empty
bitmap (i.e., an indicator that is not shown).
When fringe-indicator-alist has a buffer-local value, and
there is no bitmap defined for a logical indicator, or the bitmap is
t, the corresponding value from the default value of
fringe-indicator-alist is used.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When a line is exactly as wide as the window, Emacs displays the cursor in the right fringe instead of using two lines. Different bitmaps are used to represent the cursor in the fringe depending on the current buffer’s cursor type.
If this is non-nil, lines exactly as wide as the window (not
counting the final newline character) are not continued. Instead,
when point is at the end of the line, the cursor appears in the right
fringe.
This variable specifies the mapping from logical cursor type to the
actual fringe bitmaps displayed in the right fringe. The value is an
alist where each element has the form (cursor-type
. bitmap), which means to use the fringe bitmap bitmap to
display cursors of type cursor-type.
Each cursor-type should be one of box, hollow,
bar, hbar, or hollow-small. The first four have
the same meanings as in the cursor-type frame parameter
(see section Cursor Parameters). The hollow-small type is used
instead of hollow when the normal hollow-rectangle
bitmap is too tall to fit on a specific display line.
Each bitmap should be a symbol specifying the fringe bitmap to be displayed for that logical cursor type. See section Fringe Bitmaps.
When fringe-cursor-alist has a buffer-local value, and there is
no bitmap defined for a cursor type, the corresponding value from the
default value of fringes-indicator-alist is used.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The fringe bitmaps are the actual bitmaps which represent the
logical fringe indicators for truncated or continued lines, buffer
boundaries, overlay arrows, etc. Each bitmap is represented by a
symbol.
These symbols are referred to by the variable
fringe-indicator-alist, which maps fringe indicators to bitmaps
(see section Fringe Indicators), and the variable
fringe-cursor-alist, which maps fringe cursors to bitmaps
(see section Fringe Cursors).
Lisp programs can also directly display a bitmap in the left or
right fringe, by using a display property for one of the
characters appearing in the line (see section Other Display Specifications). Such
a display specification has the form
(fringe bitmap [face])
fringe is either the symbol left-fringe or
right-fringe. bitmap is a symbol identifying the bitmap
to display. The optional face names a face whose foreground
color is used to display the bitmap; this face is automatically merged
with the fringe face.
Here is a list of the standard fringe bitmaps defined in Emacs, and
how they are currently used in Emacs (via
fringe-indicator-alist and fringe-cursor-alist):
left-arrow, right-arrowUsed to indicate truncated lines.
left-curly-arrow, right-curly-arrowUsed to indicate continued lines.
right-triangle, left-triangleThe former is used by overlay arrows. The latter is unused.
up-arrow, down-arrow, top-left-angle top-right-anglebottom-left-angle, bottom-right-angletop-right-angle, top-left-angleleft-bracket, right-bracket, top-right-angle, top-left-angleUsed to indicate buffer boundaries.
filled-rectangle, hollow-rectanglefilled-square, hollow-squarevertical-bar, horizontal-barUsed for different types of fringe cursors.
empty-line, exclamation-mark, question-mark, exclamation-markNot used by core Emacs features.
The next subsection describes how to define your own fringe bitmaps.
This function returns the fringe bitmaps of the display line
containing position pos in window window. The return
value has the form (left right ov), where left
is the symbol for the fringe bitmap in the left fringe (or nil
if no bitmap), right is similar for the right fringe, and ov
is non-nil if there is an overlay arrow in the left fringe.
The value is nil if pos is not visible in window.
If window is nil, that stands for the selected window.
If pos is nil, that stands for the value of point in
window.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This function defines the symbol bitmap as a new fringe bitmap, or replaces an existing bitmap with that name.
The argument bits specifies the image to use. It should be either a string or a vector of integers, where each element (an integer) corresponds to one row of the bitmap. Each bit of an integer corresponds to one pixel of the bitmap, where the low bit corresponds to the rightmost pixel of the bitmap.
The height is normally the length of bits. However, you
can specify a different height with non-nil height. The width
is normally 8, but you can specify a different width with non-nil
width. The width must be an integer between 1 and 16.
The argument align specifies the positioning of the bitmap
relative to the range of rows where it is used; the default is to
center the bitmap. The allowed values are top, center,
or bottom.
The align argument may also be a list (align
periodic) where align is interpreted as described above.
If periodic is non-nil, it specifies that the rows in
bits should be repeated enough times to reach the specified
height.
This function destroy the fringe bitmap identified by bitmap. If bitmap identifies a standard fringe bitmap, it actually restores the standard definition of that bitmap, instead of eliminating it entirely.
This sets the face for the fringe bitmap bitmap to face.
If face is nil, it selects the fringe face. The
bitmap’s face controls the color to draw it in.
face is merged with the fringe face, so normally
face should specify only the foreground color.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The overlay arrow is useful for directing the user’s attention to a particular line in a buffer. For example, in the modes used for interface to debuggers, the overlay arrow indicates the line of code about to be executed. This feature has nothing to do with overlays (see section Overlays).
This variable holds the string to display to call attention to a
particular line, or nil if the arrow feature is not in use.
On a graphical display the contents of the string are ignored; instead a
glyph is displayed in the fringe area to the left of the display area.
This variable holds a marker that indicates where to display the overlay arrow. It should point at the beginning of a line. On a non-graphical display the arrow text appears at the beginning of that line, overlaying any text that would otherwise appear. Since the arrow is usually short, and the line usually begins with indentation, normally nothing significant is overwritten.
The overlay-arrow string is displayed in any given buffer if the value
of overlay-arrow-position in that buffer points into that
buffer. Thus, it is possible to display multiple overlay arrow strings
by creating buffer-local bindings of overlay-arrow-position.
However, it is usually cleaner to use
overlay-arrow-variable-list to achieve this result.
You can do a similar job by creating an overlay with a
before-string property. See section Overlay Properties.
You can define multiple overlay arrows via the variable
overlay-arrow-variable-list.
This variable’s value is a list of variables, each of which specifies
the position of an overlay arrow. The variable
overlay-arrow-position has its normal meaning because it is on
this list.
Each variable on this list can have properties
overlay-arrow-string and overlay-arrow-bitmap that
specify an overlay arrow string (for text terminals) or fringe bitmap
(for graphical terminals) to display at the corresponding overlay
arrow position. If either property is not set, the default
overlay-arrow-string or overlay-arrow fringe indicator
is used.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Normally the frame parameter vertical-scroll-bars controls
whether the windows in the frame have vertical scroll bars, and
whether they are on the left or right. The frame parameter
scroll-bar-width specifies how wide they are (nil
meaning the default). See section Layout Parameters.
This function reports the scroll bar type settings for frame
frame. The value is a cons cell
(vertical-type . horizontal-type), where
vertical-type is either left, right, or nil
(which means no scroll bar.) horizontal-type is meant to
specify the horizontal scroll bar type, but since they are not
implemented, it is always nil.
You can enable or disable scroll bars for a particular buffer,
by setting the variable vertical-scroll-bar. This variable
automatically becomes buffer-local when set. The possible values are
left, right, t, which means to use the
frame’s default, and nil for no scroll bar.
You can also control this for individual windows. Call the function
set-window-scroll-bars to specify what to do for a specific window:
This function sets the width and type of scroll bars for window window.
width specifies the scroll bar width in pixels (nil means
use the width specified for the frame). vertical-type specifies
whether to have a vertical scroll bar and, if so, where. The possible
values are left, right and nil, just like the
values of the vertical-scroll-bars frame parameter.
The argument horizontal-type is meant to specify whether and
where to have horizontal scroll bars, but since they are not
implemented, it has no effect. If window is nil, the
selected window is used.
Report the width and type of scroll bars specified for window.
If window is omitted or nil, the selected window is used.
The value is a list of the form (width
cols vertical-type horizontal-type). The value
width is the value that was specified for the width (which may
be nil); cols is the number of columns that the scroll
bar actually occupies.
horizontal-type is not actually meaningful.
This function returns the width in pixels of window’s vertical scrollbar. window must be a live window, and defaults to the selected window.
If you don’t specify these values for a window with
set-window-scroll-bars, the buffer-local variables
scroll-bar-mode and scroll-bar-width in the buffer being
displayed control the window’s vertical scroll bars. The function
set-window-buffer examines these variables. If you change them
in a buffer that is already visible in a window, you can make the
window take note of the new values by calling set-window-buffer
specifying the same buffer that is already displayed.
This variable, always local in all buffers, controls whether and where
to put scroll bars in windows displaying the buffer. The possible values
are nil for no scroll bar, left to put a scroll bar on
the left, and right to put a scroll bar on the right.
This function reports the scroll bar type for window window.
If window is omitted or nil, the selected window is used.
The value is a cons cell
(vertical-type . horizontal-type). Unlike
window-scroll-bars, this reports the scroll bar type actually
used, once frame defaults and scroll-bar-mode are taken into
account.
This variable, always local in all buffers, specifies the width of the
buffer’s scroll bars, measured in pixels. A value of nil means
to use the value specified by the frame.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Window dividers are bars drawn between a frame’s windows. A “right”
divider is drawn between a window and any adjacent windows on the right.
Its width (thickness) is specified by the frame parameter
right-divider-width. A “bottom” divider is drawn between a
window and adjacent windows on the bottom or the echo area. Its width
is specified by the frame parameter bottom-divider-width. In
either case, specifying a width of zero means to not draw such dividers.
See section Layout Parameters.
Technically, a right divider “belongs” to the window on its left, which means that its width contributes to the total width of that window. A bottom divider “belongs” to the window above it, which means that its width contributes to the total height of that window. See section Window Sizes. When a window has both, a right and a bottom divider, the bottom divider “prevails”. This means that a bottom divider is drawn over the full total width of its window while the right divider ends above the bottom divider.
Dividers can be dragged with the mouse and are therefore useful for adjusting the sizes of adjacent windows with the mouse. They also serve to visually set apart adjacent windows when no scroll bars or mode lines are present. The following three faces allow to customize the appearance of dividers:
window-dividerWhen a divider is less than three pixels wide, it is drawn solidly with the foreground of this face. For larger dividers this face is used for the inner part only, excluding the first and last pixel.
window-divider-first-pixelThis is the face used for drawing the first pixel of a divider that is
at least three pixels wide. To obtain a solid appearance, set this to
the same value used for the window-divider face.
window-divider-last-pixelThis is the face used for drawing the last pixel of a divider that is at
least three pixels wide. To obtain a solid appearance, set this to the
same value used for the window-divider face.
You can get the sizes of the dividers of a specific window with the following two functions.
Return the width (thickness) in pixels of window’s right divider. window must be a live window and defaults to the selected one. The return value is always zero for a rightmost window.
Return the width (thickness) in pixels of window’s bottom divider. window must be a live window and defaults to the selected one. The return value is zero for the minibuffer window or a bottommost window on a minibuffer-less frame.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
display PropertyThe display text property (or overlay property) is used to
insert images into text, and to control other aspects of how text
displays. The value of the display property should be a
display specification, or a list or vector containing several display
specifications. Display specifications in the same display
property value generally apply in parallel to the text they cover.
If several sources (overlays and/or a text property) specify values
for the display property, only one of the values takes effect,
following the rules of get-char-property. See section Examining Text Properties.
The rest of this section describes several kinds of display specifications and what they mean.
| 37.16.1 Display Specs That Replace The Text | Display specs that replace the text. | |
| 37.16.2 Specified Spaces | Displaying one space with a specified width. | |
| 37.16.3 Pixel Specification for Spaces | Specifying space width or height in pixels. | |
| 37.16.4 Other Display Specifications | Displaying an image; adjusting the height, spacing, and other properties of text. | |
| 37.16.5 Displaying in the Margins | Displaying text or images to the side of the main text. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Some kinds of display specifications specify something to display instead of the text that has the property. These are called replacing display specifications. Emacs does not allow the user to interactively move point into the middle of buffer text that is replaced in this way.
If a list of display specifications includes more than one replacing display specification, the first overrides the rest. Replacing display specifications make most other display specifications irrelevant, since those don’t apply to the replacement.
For replacing display specifications, “the text that has the
property” means all the consecutive characters that have the same
Lisp object as their display property; these characters are
replaced as a single unit. If two characters have different Lisp
objects as their display properties (i.e., objects which are
not eq), they are handled separately.
Here is an example which illustrates this point. A string serves as a replacing display specification, which replaces the text that has the property with the specified string (see section Other Display Specifications). Consider the following function:
(defun foo ()
(dotimes (i 5)
(let ((string (concat "A"))
(start (+ i i (point-min))))
(put-text-property start (1+ start) 'display string)
(put-text-property start (+ 2 start) 'display string))))
This function gives each of the first ten characters in the buffer a
display property which is a string "A", but they don’t
all get the same string object. The first two characters get the same
string object, so they are replaced with one ‘A’; the fact that
the display property was assigned in two separate calls to
put-text-property is irrelevant. Similarly, the next two
characters get a second string (concat creates a new string
object), so they are replaced with one ‘A’; and so on. Thus, the
ten characters appear as five A’s.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To display a space of specified width and/or height, use a display
specification of the form (space . props), where
props is a property list (a list of alternating properties and
values). You can put this property on one or more consecutive
characters; a space of the specified height and width is displayed in
place of all of those characters. These are the properties you
can use in props to specify the weight of the space:
:width widthIf width is a number, it specifies that the space width should be width times the normal character width. width can also be a pixel width specification (see section Pixel Specification for Spaces).
:relative-width factorSpecifies that the width of the stretch should be computed from the
first character in the group of consecutive characters that have the
same display property. The space width is the width of that
character, multiplied by factor.
:align-to hposSpecifies that the space should be wide enough to reach hpos. If hpos is a number, it is measured in units of the normal character width. hpos can also be a pixel width specification (see section Pixel Specification for Spaces).
You should use one and only one of the above properties. You can also specify the height of the space, with these properties:
:height heightSpecifies the height of the space. If height is a number, it specifies that the space height should be height times the normal character height. The height may also be a pixel height specification (see section Pixel Specification for Spaces).
:relative-height factorSpecifies the height of the space, multiplying the ordinary height of the text having this display specification by factor.
:ascent ascentIf the value of ascent is a non-negative number no greater than 100, it specifies that ascent percent of the height of the space should be considered as the ascent of the space—that is, the part above the baseline. The ascent may also be specified in pixel units with a pixel ascent specification (see section Pixel Specification for Spaces).
Don’t use both :height and :relative-height together.
The :width and :align-to properties are supported on
non-graphic terminals, but the other space properties in this section
are not.
Note that space properties are treated as paragraph separators for the purposes of reordering bidirectional text for display. See section Bidirectional Display, for the details.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The value of the :width, :align-to, :height,
and :ascent properties can be a special kind of expression that
is evaluated during redisplay. The result of the evaluation is used
as an absolute number of pixels.
The following expressions are supported:
expr ::= num | (num) | unit | elem | pos | image | form num ::= integer | float | symbol unit ::= in | mm | cm | width | height
elem ::= left-fringe | right-fringe | left-margin | right-margin
| scroll-bar | text
pos ::= left | center | right
form ::= (num . expr) | (op expr ...)
op ::= + | -
The form num specifies a fraction of the default frame font
height or width. The form (num) specifies an absolute
number of pixels. If num is a symbol, symbol, its
buffer-local variable binding is used.
The in, mm, and cm units specify the number of
pixels per inch, millimeter, and centimeter, respectively. The
width and height units correspond to the default width
and height of the current face. An image specification image
corresponds to the width or height of the image.
The elements left-fringe, right-fringe,
left-margin, right-margin, scroll-bar, and
text specify to the width of the corresponding area of the
window.
The left, center, and right positions can be
used with :align-to to specify a position relative to the left
edge, center, or right edge of the text area.
Any of the above window elements (except text) can also be
used with :align-to to specify that the position is relative to
the left edge of the given area. Once the base offset for a relative
position has been set (by the first occurrence of one of these
symbols), further occurrences of these symbols are interpreted as the
width of the specified area. For example, to align to the center of
the left-margin, use
:align-to (+ left-margin (0.5 . left-margin))
If no specific base offset is set for alignment, it is always relative to the left edge of the text area. For example, ‘:align-to 0’ in a header-line aligns with the first text column in the text area.
A value of the form (num . expr) stands for the
product of the values of num and expr. For example,
(2 . in) specifies a width of 2 inches, while (0.5 .
image) specifies half the width (or height) of the specified
image.
The form (+ expr ...) adds up the value of the
expressions. The form (- expr ...) negates or subtracts
the value of the expressions.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here are the other sorts of display specifications that you can use
in the display text property.
stringDisplay string instead of the text that has this property.
Recursive display specifications are not supported—string’s
display properties, if any, are not used.
(image . image-props)This kind of display specification is an image descriptor (see section Images). When used as a display specification, it means to display the image instead of the text that has the display specification.
(slice x y width height)This specification together with image specifies a slice
(a partial area) of the image to display. The elements y and
x specify the top left corner of the slice, within the image;
width and height specify the width and height of the
slice. Integers are numbers of pixels. A floating-point number
in the range 0.0–1.0 stands for that fraction of the width or height
of the entire image.
((margin nil) string)A display specification of this form means to display string instead of the text that has the display specification, at the same position as that text. It is equivalent to using just string, but it is done as a special case of marginal display (see section Displaying in the Margins).
(left-fringe bitmap [face])(right-fringe bitmap [face])This display specification on any character of a line of text causes the specified bitmap be displayed in the left or right fringes for that line, instead of the characters that have the display specification. The optional face specifies the colors to be used for the bitmap. See section Fringe Bitmaps, for the details.
(space-width factor)This display specification affects all the space characters within the text that has the specification. It displays all of these spaces factor times as wide as normal. The element factor should be an integer or float. Characters other than spaces are not affected at all; in particular, this has no effect on tab characters.
(height height)This display specification makes the text taller or shorter. Here are the possibilities for height:
(+ n)This means to use a font that is n steps larger. A “step” is defined by the set of available fonts—specifically, those that match what was otherwise specified for this text, in all attributes except height. Each size for which a suitable font is available counts as another step. n should be an integer.
(- n)This means to use a font that is n steps smaller.
A number, factor, means to use a font that is factor times as tall as the default font.
A symbol is a function to compute the height. It is called with the current height as argument, and should return the new height to use.
If the height value doesn’t fit the previous possibilities, it is
a form. Emacs evaluates it to get the new height, with the symbol
height bound to the current specified font height.
(raise factor)This kind of display specification raises or lowers the text it applies to, relative to the baseline of the line.
factor must be a number, which is interpreted as a multiple of the height of the affected text. If it is positive, that means to display the characters raised. If it is negative, that means to display them lower down.
If the text also has a height display specification, that does
not affect the amount of raising or lowering, which is based on the
faces used for the text.
You can make any display specification conditional. To do that,
package it in another list of the form
(when condition . spec).
Then the specification spec applies only when
condition evaluates to a non-nil value. During the
evaluation, object is bound to the string or buffer having the
conditional display property. position and
buffer-position are bound to the position within object
and the buffer position where the display property was found,
respectively. Both positions can be different when object is a
string.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A buffer can have blank areas called display margins on the
left and on the right. Ordinary text never appears in these areas,
but you can put things into the display margins using the
display property. There is currently no way to make text or
images in the margin mouse-sensitive.
The way to display something in the margins is to specify it in a
margin display specification in the display property of some
text. This is a replacing display specification, meaning that the
text you put it on does not get displayed; the margin display appears,
but that text does not.
A margin display specification looks like ((margin
right-margin) spec) or ((margin left-margin) spec).
Here, spec is another display specification that says what to
display in the margin. Typically it is a string of text to display,
or an image descriptor.
To display something in the margin in association with
certain buffer text, without altering or preventing the display of
that text, put a before-string property on the text and put the
margin display specification on the contents of the before-string.
Before the display margins can display anything, you must give them a nonzero width. The usual way to do that is to set these variables:
This variable specifies the width of the left margin, in character
cell (a.k.a. “column”) units. It is buffer-local in all buffers.
A value of nil means no left marginal area.
This variable specifies the width of the right margin, in character
cell units. It is buffer-local in all buffers. A value of nil
means no right marginal area.
Setting these variables does not immediately affect the window. These
variables are checked when a new buffer is displayed in the window.
Thus, you can make changes take effect by calling
set-window-buffer.
You can also set the margin widths immediately.
This function specifies the margin widths for window window, in
character cell units. The argument left controls the left
margin, and right controls the right margin (default 0).
This function returns the width of the left and right margins of
window as a cons cell of the form (left . right). If one of the two marginal areas does not exist,
its width is returned as nil; if neither of the two margins exist,
the function returns (nil). If window is nil, the
selected window is used.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To display an image in an Emacs buffer, you must first create an image
descriptor, then use it as a display specifier in the display
property of text that is displayed (see section The display Property).
Emacs is usually able to display images when it is run on a
graphical terminal. Images cannot be displayed in a text terminal, on
certain graphical terminals that lack the support for this, or if
Emacs is compiled without image support. You can use the function
display-images-p to determine if images can in principle be
displayed (see section Display Feature Testing).
| 37.17.1 Image Formats | Supported image formats. | |
| 37.17.2 Image Descriptors | How to specify an image for use in :display.
| |
| 37.17.3 XBM Images | Special features for XBM format. | |
| 37.17.4 XPM Images | Special features for XPM format. | |
| 37.17.5 PostScript Images | Special features for PostScript format. | |
| 37.17.6 ImageMagick Images | Special features available through ImageMagick. | |
| 37.17.7 Other Image Types | Various other formats are supported. | |
| 37.17.8 Defining Images | Convenient ways to define an image for later use. | |
| 37.17.9 Showing Images | Convenient ways to display an image once it is defined. | |
| 37.17.10 Multi-Frame Images | Some images contain more than one frame. | |
| 37.17.11 Image Cache | Internal mechanisms of image display. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs can display a number of different image formats. Some of
these image formats are supported only if particular support libraries
are installed. On some platforms, Emacs can load support libraries on
demand; if so, the variable dynamic-library-alist can be used
to modify the set of known names for these dynamic libraries.
See section Dynamically Loaded Libraries.
Supported image formats (and the required support libraries) include
PBM and XBM (which do not depend on support libraries and are always
available), XPM (libXpm), GIF (libgif or
libungif), PostScript (gs), JPEG (libjpeg), TIFF
(libtiff), PNG (libpng), and SVG (librsvg).
Each of these image formats is associated with an image type
symbol. The symbols for the above formats are, respectively,
pbm, xbm, xpm, gif, postscript,
jpeg, tiff, png, and svg.
Furthermore, if you build Emacs with ImageMagick
(libMagickWand) support, Emacs can display any image format
that ImageMagick can. See section ImageMagick Images. All images
displayed via ImageMagick have type symbol imagemagick.
This variable contains a list of type symbols for image formats which are potentially supported in the current configuration.
“Potentially” means that Emacs knows about the image types, not
necessarily that they can be used (for example, they could depend on
unavailable dynamic libraries). To know which image types are really
available, use image-type-available-p.
This function returns non-nil if images of type type can
be loaded and displayed. type must be an image type symbol.
For image types whose support libraries are statically linked, this
function always returns t. For image types whose support
libraries are dynamically loaded, it returns t if the library
could be loaded and nil otherwise.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
An image descriptor is a list which specifies the underlying
data for an image, and how to display it. It is typically used as the
value of a display overlay or text property (see section Other Display Specifications); but See section Showing Images, for convenient helper
functions to insert images into buffers.
Each image descriptor has the form (image . props),
where props is a property list of alternating keyword symbols
and values, including at least the pair :type type that
specifies the image type.
The following is a list of properties that are meaningful for all image types (there are also properties which are meaningful only for certain image types, as documented in the following subsections):
:type typeThe image type. See section Image Formats. Every image descriptor must include this property.
:file fileThis says to load the image from file file. If file is
not an absolute file name, it is expanded in data-directory.
:data dataThis specifies the raw image data. Each image descriptor must have
either :data or :file, but not both.
For most image types, the value of a :data property should be a
string containing the image data. Some image types do not support
:data; for some others, :data alone is not enough, so
you need to use other image properties along with :data. See
the following subsections for details.
:margin marginThis specifies how many pixels to add as an extra margin around the
image. The value, margin, must be a non-negative number, or a
pair (x . y) of such numbers. If it is a pair,
x specifies how many pixels to add horizontally, and y
specifies how many pixels to add vertically. If :margin is not
specified, the default is zero.
:ascent ascentThis specifies the amount of the image’s height to use for its
ascent—that is, the part above the baseline. The value,
ascent, must be a number in the range 0 to 100, or the symbol
center.
If ascent is a number, that percentage of the image’s height is used for its ascent.
If ascent is center, the image is vertically centered
around a centerline which would be the vertical centerline of text drawn
at the position of the image, in the manner specified by the text
properties and overlays that apply to the image.
If this property is omitted, it defaults to 50.
:relief reliefThis adds a shadow rectangle around the image. The value, relief, specifies the width of the shadow lines, in pixels. If relief is negative, shadows are drawn so that the image appears as a pressed button; otherwise, it appears as an unpressed button.
:conversion algorithmThis specifies a conversion algorithm that should be applied to the image before it is displayed; the value, algorithm, specifies which algorithm.
laplaceembossSpecifies the Laplace edge detection algorithm, which blurs out small differences in color while highlighting larger differences. People sometimes consider this useful for displaying the image for a “disabled” button.
(edge-detection :matrix matrix :color-adjust adjust)Specifies a general edge-detection algorithm. matrix must be either a nine-element list or a nine-element vector of numbers. A pixel at position x/y in the transformed image is computed from original pixels around that position. matrix specifies, for each pixel in the neighborhood of x/y, a factor with which that pixel will influence the transformed pixel; element 0 specifies the factor for the pixel at x-1/y-1, element 1 the factor for the pixel at x/y-1 etc., as shown below:
(x-1/y-1 x/y-1 x+1/y-1 x-1/y x/y x+1/y x-1/y+1 x/y+1 x+1/y+1)
The resulting pixel is computed from the color intensity of the color resulting from summing up the RGB values of surrounding pixels, multiplied by the specified factors, and dividing that sum by the sum of the factors’ absolute values.
Laplace edge-detection currently uses a matrix of
(1 0 0 0 0 0 0 0 -1)
Emboss edge-detection uses a matrix of
( 2 -1 0
-1 0 1
0 1 -2)
disabledSpecifies transforming the image so that it looks “disabled”.
:mask maskIf mask is heuristic or (heuristic bg), build
a clipping mask for the image, so that the background of a frame is
visible behind the image. If bg is not specified, or if bg
is t, determine the background color of the image by looking at
the four corners of the image, assuming the most frequently occurring
color from the corners is the background color of the image. Otherwise,
bg must be a list (red green blue)
specifying the color to assume for the background of the image.
If mask is nil, remove a mask from the image, if it has
one. Images in some formats include a mask which can be removed by
specifying :mask nil.
:pointer shapeThis specifies the pointer shape when the mouse pointer is over this image. See section Pointer Shape, for available pointer shapes.
:map mapThis associates an image map of hot spots with this image.
An image map is an alist where each element has the format
(area id plist). An area is specified
as either a rectangle, a circle, or a polygon.
A rectangle is a cons
(rect . ((x0 . y0) . (x1 . y1)))
which specifies the pixel coordinates of the upper left and bottom right
corners of the rectangle area.
A circle is a cons
(circle . ((x0 . y0) . r))
which specifies the center and the radius of the circle; r may
be a float or integer.
A polygon is a cons
(poly . [x0 y0 x1 y1 ...])
where each pair in the vector describes one corner in the polygon.
When the mouse pointer lies on a hot-spot area of an image, the
plist of that hot-spot is consulted; if it contains a help-echo
property, that defines a tool-tip for the hot-spot, and if it contains
a pointer property, that defines the shape of the mouse cursor when
it is on the hot-spot.
See section Pointer Shape, for available pointer shapes.
When you click the mouse when the mouse pointer is over a hot-spot, an
event is composed by combining the id of the hot-spot with the
mouse event; for instance, [area4 mouse-1] if the hot-spot’s
id is area4.
This function returns t if image spec has a mask bitmap.
frame is the frame on which the image will be displayed.
frame nil or omitted means to use the selected frame
(see section Input Focus).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To use XBM format, specify xbm as the image type. This image
format doesn’t require an external library, so images of this type are
always supported.
Additional image properties supported for the xbm image type are:
:foreground foregroundThe value, foreground, should be a string specifying the image
foreground color, or nil for the default color. This color is
used for each pixel in the XBM that is 1. The default is the frame’s
foreground color.
:background backgroundThe value, background, should be a string specifying the image
background color, or nil for the default color. This color is
used for each pixel in the XBM that is 0. The default is the frame’s
background color.
If you specify an XBM image using data within Emacs instead of an external file, use the following three properties:
:data dataThe value, data, specifies the contents of the image. There are three formats you can use for data:
:height and :width.
:height and :width in this case,
because omitting them is what indicates the data has the format of an
XBM file. The file contents specify the height and width of the image.
height bits. In this case, you must specify
:height and :width, both to indicate that the string
contains just the bits rather than a whole XBM file, and to specify the
size of the image.
:width widthThe value, width, specifies the width of the image, in pixels.
:height heightThe value, height, specifies the height of the image, in pixels.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To use XPM format, specify xpm as the image type. The
additional image property :color-symbols is also meaningful with
the xpm image type:
:color-symbols symbolsThe value, symbols, should be an alist whose elements have the
form (name . color). In each element, name is
the name of a color as it appears in the image file, and color
specifies the actual color to use for displaying that name.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To use PostScript for an image, specify image type postscript.
This works only if you have Ghostscript installed. You must always use
these three properties:
:pt-width widthThe value, width, specifies the width of the image measured in points (1/72 inch). width must be an integer.
:pt-height heightThe value, height, specifies the height of the image in points (1/72 inch). height must be an integer.
:bounding-box boxThe value, box, must be a list or vector of four integers, which specifying the bounding box of the PostScript image, analogous to the ‘BoundingBox’ comment found in PostScript files.
%%BoundingBox: 22 171 567 738
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If you build Emacs with ImageMagick support, you can use the
ImageMagick library to load many image formats (see File
Conveniences in The GNU Emacs Manual). The image type symbol
for images loaded via ImageMagick is imagemagick, regardless of
the actual underlying image format.
This function returns a list of image file extensions supported by the
current ImageMagick installation. Each list element is a symbol
representing an internal ImageMagick name for an image type, such as
BMP for .bmp images.
The value of this variable is a list of ImageMagick image types which
Emacs may attempt to render using ImageMagick. Each list element
should be one of the symbols in the list returned by
imagemagick-types, or an equivalent string. Alternatively, a
value of t enables ImageMagick for all possible image types.
Regardless of the value of this variable,
imagemagick-types-inhibit (see below) takes precedence.
The value of this variable lists the ImageMagick image types which
should never be rendered using ImageMagick, regardless of the value of
imagemagick-enabled-types. A value of t disables
ImageMagick entirely.
This variable is an alist mapping image types to file name extensions.
Emacs uses this in conjunction with the :format image property
(see below) to give a hint to the ImageMagick library as to the type
of an image. Each element has the form (type
extension), where type is a symbol specifying an image
content-type, and extension is a string that specifies the
associated file name extension.
Images loaded with ImageMagick support the following additional image descriptor properties:
:background backgroundbackground, if non-nil, should be a string specifying a
color, which is used as the image’s background color if the image
supports transparency. If the value is nil, it defaults to the
frame’s background color.
:width width, :height heightThe :width and :height keywords are used for scaling the
image. If only one of them is specified, the other one will be
calculated so as to preserve the aspect ratio. If both are specified,
aspect ratio may not be preserved.
:max-width max-width, :max-height max-heightThe :max-width and :max-height keywords are used for
scaling if the size of the image of the image exceeds these values.
If :width is set it will have precedence over max-width,
and if :height is set it will have precedence over
max-height, but you can otherwise mix these keywords as you
wish. :max-width and :max-height will always preserve
the aspect ratio.
:format typeThe value, type, should be a symbol specifying the type of the
image data, as found in image-format-suffixes. This is used
when the image does not have an associated file name, to provide a
hint to ImageMagick to help it detect the image type.
:rotation angleSpecifies a rotation angle in degrees.
:index frameSee section Multi-Frame Images.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
For PBM images, specify image type pbm. Color, gray-scale and
monochromatic images are supported. For mono PBM images, two additional
image properties are supported.
:foreground foregroundThe value, foreground, should be a string specifying the image
foreground color, or nil for the default color. This color is
used for each pixel in the PBM that is 1. The default is the frame’s
foreground color.
:background backgroundThe value, background, should be a string specifying the image
background color, or nil for the default color. This color is
used for each pixel in the PBM that is 0. The default is the frame’s
background color.
The remaining image types that Emacs can support are:
Image type gif.
Supports the :index property. See section Multi-Frame Images.
Image type jpeg.
Image type png.
Image type svg.
Image type tiff.
Supports the :index property. See section Multi-Frame Images.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The functions create-image, defimage and
find-image provide convenient ways to create image descriptors.
This function creates and returns an image descriptor which uses the
data in file-or-data. file-or-data can be a file name or
a string containing the image data; data-p should be nil
for the former case, non-nil for the latter case.
The optional argument type is a symbol specifying the image type.
If type is omitted or nil, create-image tries to
determine the image type from the file’s first few bytes, or else
from the file’s name.
The remaining arguments, props, specify additional image properties—for example,
(create-image "foo.xpm" 'xpm nil :heuristic-mask t)
The function returns nil if images of this type are not
supported. Otherwise it returns an image descriptor.
This macro defines symbol as an image name. The arguments specs is a list which specifies how to display the image. The third argument, doc, is an optional documentation string.
Each argument in specs has the form of a property list, and each
one should specify at least the :type property and either the
:file or the :data property. The value of :type
should be a symbol specifying the image type, the value of
:file is the file to load the image from, and the value of
:data is a string containing the actual image data. Here is an
example:
(defimage test-image ((:type xpm :file "~/test1.xpm") (:type xbm :file "~/test1.xbm")))
defimage tests each argument, one by one, to see if it is
usable—that is, if the type is supported and the file exists. The
first usable argument is used to make an image descriptor which is
stored in symbol.
If none of the alternatives will work, then symbol is defined
as nil.
This function provides a convenient way to find an image satisfying one of a list of image specifications specs.
Each specification in specs is a property list with contents
depending on image type. All specifications must at least contain the
properties :type type and either :file file
or :data data, where type is a symbol specifying
the image type, e.g., xbm, file is the file to load the
image from, and data is a string containing the actual image data.
The first specification in the list whose type is supported, and
file exists, is used to construct the image specification to be
returned. If no specification is satisfied, nil is returned.
The image is looked for in image-load-path.
This variable’s value is a list of locations in which to search for image files. If an element is a string or a variable symbol whose value is a string, the string is taken to be the name of a directory to search. If an element is a variable symbol whose value is a list, that is taken to be a list of directory names to search.
The default is to search in the images subdirectory of the
directory specified by data-directory, then the directory
specified by data-directory, and finally in the directories in
load-path. Subdirectories are not automatically included in
the search, so if you put an image file in a subdirectory, you have to
supply the subdirectory name explicitly. For example, to find the
image images/foo/bar.xpm within data-directory, you
should specify the image as follows:
(defimage foo-image '((:type xpm :file "foo/bar.xpm")))
This function returns a suitable search path for images used by the Lisp package library.
The function searches for image first using image-load-path,
excluding data-directory/images, and then in
load-path, followed by a path suitable for library, which
includes ../../etc/images and ../etc/images relative to
the library file itself, and finally in
data-directory/images.
Then this function returns a list of directories which contains first
the directory in which image was found, followed by the value of
load-path. If path is given, it is used instead of
load-path.
If no-error is non-nil and a suitable path can’t be
found, don’t signal an error. Instead, return a list of directories as
before, except that nil appears in place of the image directory.
Here is an example of using image-load-path-for-library:
(defvar image-load-path) ; shush compiler
(let* ((load-path (image-load-path-for-library
"mh-e" "mh-logo.xpm"))
(image-load-path (cons (car load-path)
image-load-path)))
(mh-tool-bar-folder-buttons-init))
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can use an image descriptor by setting up the display
property yourself, but it is easier to use the functions in this
section.
This function inserts image in the current buffer at point. The
value image should be an image descriptor; it could be a value
returned by create-image, or the value of a symbol defined with
defimage. The argument string specifies the text to put
in the buffer to hold the image. If it is omitted or nil,
insert-image uses " " by default.
The argument area specifies whether to put the image in a margin.
If it is left-margin, the image appears in the left margin;
right-margin specifies the right margin. If area is
nil or omitted, the image is displayed at point within the
buffer’s text.
The argument slice specifies a slice of the image to insert. If
slice is nil or omitted the whole image is inserted.
Otherwise, slice is a list (x y width
height) which specifies the x and y positions and
width and height of the image area to insert. Integer
values are in units of pixels. A floating-point number in the range
0.0–1.0 stands for that fraction of the width or height of the entire
image.
Internally, this function inserts string in the buffer, and gives
it a display property which specifies image. See section The display Property.
This function inserts image in the current buffer at point, like
insert-image, but splits the image into rowsxcols
equally sized slices.
If an image is inserted “sliced”, Emacs displays each slice as a separate image, and allow more intuitive scrolling up/down, instead of jumping up/down the entire image when paging through a buffer that displays (large) images.
This function puts image image in front of pos in the current buffer. The argument pos should be an integer or a marker. It specifies the buffer position where the image should appear. The argument string specifies the text that should hold the image as an alternative to the default.
The argument image must be an image descriptor, perhaps returned
by create-image or stored by defimage.
The argument area specifies whether to put the image in a margin.
If it is left-margin, the image appears in the left margin;
right-margin specifies the right margin. If area is
nil or omitted, the image is displayed at point within the
buffer’s text.
Internally, this function creates an overlay, and gives it a
before-string property containing text that has a display
property whose value is the image. (Whew!)
This function removes images in buffer between positions
start and end. If buffer is omitted or nil,
images are removed from the current buffer.
This removes only images that were put into buffer the way
put-image does it, not images that were inserted with
insert-image or in other ways.
This function returns the size of an image as a pair
(width . height). spec is an image
specification. pixels non-nil means return sizes
measured in pixels, otherwise return sizes measured in canonical
character units (fractions of the width/height of the frame’s default
font). frame is the frame on which the image will be displayed.
frame null or omitted means use the selected frame (see section Input Focus).
This variable is used to define the maximum size of image that Emacs will load. Emacs will refuse to load (and display) any image that is larger than this limit.
If the value is an integer, it directly specifies the maximum image height and width, measured in pixels. If it is floating point, it specifies the maximum image height and width as a ratio to the frame height and width. If the value is non-numeric, there is no explicit limit on the size of images.
The purpose of this variable is to prevent unreasonably large images
from accidentally being loaded into Emacs. It only takes effect the
first time an image is loaded. Once an image is placed in the image
cache, it can always be displayed, even if the value of
max-image-size is subsequently changed (see section Image Cache).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Some image files can contain more than one image. We say that there are multiple “frames” in the image. At present, Emacs supports multiple frames for GIF, TIFF, and certain ImageMagick formats such as DJVM.
The frames can be used either to represent multiple “pages” (this is usually the case with multi-frame TIFF files, for example), or to create animation (usually the case with multi-frame GIF files).
A multi-frame image has a property :index, whose value is an
integer (counting from 0) that specifies which frame is being displayed.
This function returns non-nil if image contains more than
one frame. The actual return value is a cons (nimages
. delay), where nimages is the number of frames and
delay is the delay in seconds between them, or nil
if the image does not specify a delay. Images that are intended to be
animated usually specify a frame delay, whereas ones that are intended
to be treated as multiple pages do not.
This function returns the index of the current frame number for image, counting from 0.
This function switches image to frame number n. It
replaces a frame number outside the valid range with that of the end
of the range, unless nocheck is non-nil. If image
does not contain a frame with the specified number, the image displays
as a hollow box.
This function animates image. The optional integer index
specifies the frame from which to start (default 0). The optional
argument limit controls the length of the animation. If omitted
or nil, the image animates once only; if t it loops
forever; if a number animation stops after that many seconds.
Animation operates by means of a timer. Note that Emacs imposes a
minimum frame delay of 0.01 (image-minimum-frame-delay) seconds.
If the image itself does not specify a delay, Emacs uses
image-default-frame-delay.
This function returns the timer responsible for animating image, if there is one.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs caches images so that it can display them again more
efficiently. When Emacs displays an image, it searches the image
cache for an existing image specification equal to the desired
specification. If a match is found, the image is displayed from the
cache. Otherwise, Emacs loads the image normally.
This function removes the image with specification spec from the
image cache of frame frame. Image specifications are compared
using equal. If frame is nil, it defaults to the
selected frame. If frame is t, the image is flushed on
all existing frames.
In Emacs’s current implementation, each graphical terminal possesses an image cache, which is shared by all the frames on that terminal (see section Multiple Terminals). Thus, refreshing an image in one frame also refreshes it in all other frames on the same terminal.
One use for image-flush is to tell Emacs about a change in an
image file. If an image specification contains a :file
property, the image is cached based on the file’s contents when the
image is first displayed. Even if the file subsequently changes,
Emacs continues displaying the old version of the image. Calling
image-flush flushes the image from the cache, forcing Emacs to
re-read the file the next time it needs to display that image.
Another use for image-flush is for memory conservation. If
your Lisp program creates a large number of temporary images over a
period much shorter than image-cache-eviction-delay (see
below), you can opt to flush unused images yourself, instead of
waiting for Emacs to do it automatically.
This function clears an image cache, removing all the images stored in
it. If filter is omitted or nil, it clears the cache for
the selected frame. If filter is a frame, it clears the cache
for that frame. If filter is t, all image caches are
cleared. Otherwise, filter is taken to be a file name, and all
images associated with that file name are removed from all image
caches.
If an image in the image cache has not been displayed for a specified period of time, Emacs removes it from the cache and frees the associated memory.
This variable specifies the number of seconds an image can remain in the cache without being displayed. When an image is not displayed for this length of time, Emacs removes it from the image cache.
Under some circumstances, if the number of images in the cache grows too large, the actual eviction delay may be shorter than this.
If the value is nil, Emacs does not remove images from the cache
except when you explicitly clear it. This mode can be useful for
debugging.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The Button package defines functions for inserting and manipulating buttons that can be activated with the mouse or via keyboard commands. These buttons are typically used for various kinds of hyperlinks.
A button is essentially a set of text or overlay properties, attached to a stretch of text in a buffer. These properties are called button properties. One of these properties, the action property, specifies a function which is called when the user invokes the button using the keyboard or the mouse. The action function may examine the button and use its other properties as desired.
In some ways, the Button package duplicates the functionality in the Widget package. See Introduction in The Emacs Widget Library. The advantage of the Button package is that it is faster, smaller, and simpler to program. From the point of view of the user, the interfaces produced by the two packages are very similar.
| 37.18.1 Button Properties | Button properties with special meanings. | |
| 37.18.2 Button Types | Defining common properties for classes of buttons. | |
| 37.18.3 Making Buttons | Adding buttons to Emacs buffers. | |
| 37.18.4 Manipulating Buttons | Getting and setting properties of buttons. | |
| 37.18.5 Button Buffer Commands | Buffer-wide commands and bindings for buttons. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Each button has an associated list of properties defining its appearance and behavior, and other arbitrary properties may be used for application specific purposes. The following properties have special meaning to the Button package:
actionThe function to call when the user invokes the button, which is passed
the single argument button. By default this is ignore,
which does nothing.
mouse-actionThis is similar to action, and when present, will be used
instead of action for button invocations resulting from
mouse-clicks (instead of the user hitting RET). If not
present, mouse-clicks use action instead.
faceThis is an Emacs face controlling how buttons of this type are
displayed; by default this is the button face.
mouse-faceThis is an additional face which controls appearance during
mouse-overs (merged with the usual button face); by default this is
the usual Emacs highlight face.
keymapThe button’s keymap, defining bindings active within the button
region. By default this is the usual button region keymap, stored
in the variable button-map, which defines RET and
mouse-2 to invoke the button.
typeThe button type. See section Button Types.
help-echoA string displayed by the Emacs tool-tip help system; by default,
"mouse-2, RET: Push this button".
follow-linkThe follow-link property, defining how a Mouse-1 click behaves on this button, See section Defining Clickable Text.
buttonAll buttons have a non-nil button property, which may be useful
in finding regions of text that comprise buttons (which is what the
standard button functions do).
There are other properties defined for the regions of text in a button, but these are not generally interesting for typical uses.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Every button has a button type, which defines default values for the button’s properties. Button types are arranged in a hierarchy, with specialized types inheriting from more general types, so that it’s easy to define special-purpose types of buttons for specific tasks.
Define a ‘button type’ called name (a symbol).
The remaining arguments
form a sequence of property value pairs, specifying default
property values for buttons with this type (a button’s type may be set
by giving it a type property when creating the button, using
the :type keyword argument).
In addition, the keyword argument :supertype may be used to
specify a button-type from which name inherits its default
property values. Note that this inheritance happens only when
name is defined; subsequent changes to a supertype are not
reflected in its subtypes.
Using define-button-type to define default properties for
buttons is not necessary—buttons without any specified type use the
built-in button-type button—but it is encouraged, since
doing so usually makes the resulting code clearer and more efficient.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Buttons are associated with a region of text, using an overlay or
text properties to hold button-specific information, all of which are
initialized from the button’s type (which defaults to the built-in
button type button). Like all Emacs text, the appearance of
the button is governed by the face property; by default (via
the face property inherited from the button button-type)
this is a simple underline, like a typical web-page link.
For convenience, there are two sorts of button-creation functions,
those that add button properties to an existing region of a buffer,
called make-...button, and those that also insert the button
text, called insert-...button.
The button-creation functions all take the &rest argument
properties, which should be a sequence of property value
pairs, specifying properties to add to the button; see Button Properties. In addition, the keyword argument :type may be
used to specify a button-type from which to inherit other properties;
see Button Types. Any properties not explicitly specified
during creation will be inherited from the button’s type (if the type
defines such a property).
The following functions add a button using an overlay (see section Overlays) to hold the button properties:
This makes a button from beg to end in the current buffer, and returns it.
This insert a button with the label label at point, and returns it.
The following functions are similar, but using text properties (see section Text Properties) to hold the button properties. Such buttons do not add markers to the buffer, so editing in the buffer does not slow down if there is an extremely large numbers of buttons. However, if there is an existing face text property on the text (e.g., a face assigned by Font Lock mode), the button face may not be visible. Both of these functions return the starting position of the new button.
This makes a button from beg to end in the current buffer, using text properties.
This inserts a button with the label label at point, using text properties.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These are functions for getting and setting properties of buttons. Often these are used by a button’s invocation function to determine what to do.
Where a button parameter is specified, it means an object referring to a specific button, either an overlay (for overlay buttons), or a buffer-position or marker (for text property buttons). Such an object is passed as the first argument to a button’s invocation function when it is invoked.
Return the position at which button starts.
Return the position at which button ends.
Get the property of button button named prop.
Set button’s prop property to val.
Call button’s action property (i.e., invoke the function
that is the value of that property, passing it the single argument
button). If use-mouse-action is non-nil, try to
invoke the button’s mouse-action property instead of
action; if the button has no mouse-action property, use
action as normal.
Return button’s text label.
Return button’s button-type.
Return t if button has button-type type, or one of
type’s subtypes.
Return the button at position pos in the current buffer, or
nil. If the button at pos is a text property button, the
return value is a marker pointing to pos.
Set the button-type type’s prop property to val.
Get the property of button-type type named prop.
Return t if button-type type is a subtype of supertype.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These are commands and functions for locating and operating on buttons in an Emacs buffer.
push-button is the command that a user uses to actually ‘push’
a button, and is bound by default in the button itself to RET
and to mouse-2 using a local keymap in the button’s overlay or
text properties. Commands that are useful outside the buttons itself,
such as forward-button and backward-button are
additionally available in the keymap stored in
button-buffer-map; a mode which uses buttons may want to use
button-buffer-map as a parent keymap for its keymap.
If the button has a non-nil follow-link property, and
mouse-1-click-follows-link is set, a quick Mouse-1 click
will also activate the push-button command.
See section Defining Clickable Text.
Perform the action specified by a button at location pos.
pos may be either a buffer position or a mouse-event. If
use-mouse-action is non-nil, or pos is a
mouse-event (see section Mouse Events), try to invoke the button’s
mouse-action property instead of action; if the button
has no mouse-action property, use action as normal.
pos defaults to point, except when push-button is invoked
interactively as the result of a mouse-event, in which case, the mouse
event’s position is used. If there’s no button at pos, do
nothing and return nil, otherwise return t.
Move to the nth next button, or nth previous button if
n is negative. If n is zero, move to the start of any
button at point. If wrap is non-nil, moving past either
end of the buffer continues from the other end. If
display-message is non-nil, the button’s help-echo string
is displayed. Any button with a non-nil skip property
is skipped over. Returns the button found.
Move to the nth previous button, or nth next button if
n is negative. If n is zero, move to the start of any
button at point. If wrap is non-nil, moving past either
end of the buffer continues from the other end. If
display-message is non-nil, the button’s help-echo string
is displayed. Any button with a non-nil skip property
is skipped over. Returns the button found.
Return the next button after (for next-button) or before (for
previous-button) position pos in the current buffer. If
count-current is non-nil, count any button at pos
in the search, instead of starting at the next button.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The Ewoc package constructs buffer text that represents a structure of Lisp objects, and updates the text to follow changes in that structure. This is like the “view” component in the “model/view/controller” design paradigm. Ewoc means “Emacs’s Widget for Object Collections”.
An ewoc is a structure that organizes information required to construct buffer text that represents certain Lisp data. The buffer text of the ewoc has three parts, in order: first, fixed header text; next, textual descriptions of a series of data elements (Lisp objects that you specify); and last, fixed footer text. Specifically, an ewoc contains information on:
Typically, you define an ewoc with ewoc-create, and then pass
the resulting ewoc structure to other functions in the Ewoc package to
build nodes within it, and display it in the buffer. Once it is
displayed in the buffer, other functions determine the correspondence
between buffer positions and nodes, move point from one node’s textual
representation to another, and so forth. See section Abstract Display Functions.
A node encapsulates a data element much the way a variable holds a value. Normally, encapsulation occurs as a part of adding a node to the ewoc. You can retrieve the data element value and place a new value in its place, like so:
(ewoc-data node) ⇒ value (ewoc-set-data node new-value) ⇒ new-value
You can also use, as the data element value, a Lisp object (list or vector) that is a container for the “real” value, or an index into some other structure. The example (see section Abstract Display Example) uses the latter approach.
When the data changes, you will want to update the text in the
buffer. You can update all nodes by calling ewoc-refresh, or
just specific nodes using ewoc-invalidate, or all nodes
satisfying a predicate using ewoc-map. Alternatively, you can
delete invalid nodes using ewoc-delete or ewoc-filter,
and add new nodes in their place. Deleting a node from an ewoc deletes
its associated textual description from buffer, as well.
| 37.19.1 Abstract Display Functions | Functions in the Ewoc package. | |
| 37.19.2 Abstract Display Example | Example of using Ewoc. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In this subsection, ewoc and node stand for the structures described above (see section Abstract Display), while data stands for an arbitrary Lisp object used as a data element.
This constructs and returns a new ewoc, with no nodes (and thus no data
elements). pretty-printer should be a function that takes one
argument, a data element of the sort you plan to use in this ewoc, and
inserts its textual description at point using insert (and never
insert-before-markers, because that would interfere with the
Ewoc package’s internal mechanisms).
Normally, a newline is automatically inserted after the header,
the footer and every node’s textual description. If nosep
is non-nil, no newline is inserted. This may be useful for
displaying an entire ewoc on a single line, for example, or for
making nodes “invisible” by arranging for pretty-printer
to do nothing for those nodes.
An ewoc maintains its text in the buffer that is current when
you create it, so switch to the intended buffer before calling
ewoc-create.
This returns the buffer where ewoc maintains its text.
This returns a cons cell (header . footer)
made from ewoc’s header and footer.
This sets the header and footer of ewoc to the strings header and footer, respectively.
These add a new node encapsulating data, putting it, respectively, at the beginning or end of ewoc’s chain of nodes.
These add a new node encapsulating data, adding it to ewoc before or after node, respectively.
These return, respectively, the previous node and the next node of node in ewoc.
This returns the node in ewoc found at zero-based index n.
A negative n means count from the end. ewoc-nth returns
nil if n is out of range.
This extracts the data encapsulated by node and returns it.
This sets the data encapsulated by node to data.
This determines the node in ewoc which contains point (or
pos if specified), and returns that node. If ewoc has no
nodes, it returns nil. If pos is before the first node,
it returns the first node; if pos is after the last node, it returns
the last node. The optional third arg guess
should be a node that is likely to be near pos; this doesn’t
alter the result, but makes the function run faster.
This returns the start position of node.
These move point to the previous or next, respectively, argth node
in ewoc. ewoc-goto-prev does not move if it is already at
the first node or if ewoc is empty, whereas ewoc-goto-next
moves past the last node, returning nil. Excepting this special
case, these functions return the node moved to.
This moves point to the start of node in ewoc.
This function regenerates the text of ewoc. It works by deleting the text between the header and the footer, i.e., all the data elements’ representations, and then calling the pretty-printer function for each node, one by one, in order.
This is similar to ewoc-refresh, except that only nodes in
ewoc are updated instead of the entire set.
This deletes each node in nodes from ewoc.
This calls predicate for each data element in ewoc and
deletes those nodes for which predicate returns nil.
Any args are passed to predicate.
This calls predicate for each data element in ewoc
and returns a list of those elements for which predicate
returns non-nil. The elements in the list are ordered
as in the buffer. Any args are passed to predicate.
This calls map-function for each data element in ewoc and
updates those nodes for which map-function returns non-nil.
Any args are passed to map-function.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here is a simple example using functions of the ewoc package to implement a “color components display”, an area in a buffer that represents a vector of three integers (itself representing a 24-bit RGB value) in various ways.
(setq colorcomp-ewoc nil
colorcomp-data nil
colorcomp-mode-map nil
colorcomp-labels ["Red" "Green" "Blue"])
(defun colorcomp-pp (data)
(if data
(let ((comp (aref colorcomp-data data)))
(insert (aref colorcomp-labels data) "\t: #x"
(format "%02X" comp) " "
(make-string (ash comp -2) ?#) "\n"))
(let ((cstr (format "#%02X%02X%02X"
(aref colorcomp-data 0)
(aref colorcomp-data 1)
(aref colorcomp-data 2)))
(samp " (sample text) "))
(insert "Color\t: "
(propertize samp 'face
`(foreground-color . ,cstr))
(propertize samp 'face
`(background-color . ,cstr))
"\n"))))
(defun colorcomp (color)
"Allow fiddling with COLOR in a new buffer.
The buffer is in Color Components mode."
(interactive "sColor (name or #RGB or #RRGGBB): ")
(when (string= "" color)
(setq color "green"))
(unless (color-values color)
(error "No such color: %S" color))
(switch-to-buffer
(generate-new-buffer (format "originally: %s" color)))
(kill-all-local-variables)
(setq major-mode 'colorcomp-mode
mode-name "Color Components")
(use-local-map colorcomp-mode-map)
(erase-buffer)
(buffer-disable-undo)
(let ((data (apply 'vector (mapcar (lambda (n) (ash n -8))
(color-values color))))
(ewoc (ewoc-create 'colorcomp-pp
"\nColor Components\n\n"
(substitute-command-keys
"\n\\{colorcomp-mode-map}"))))
(set (make-local-variable 'colorcomp-data) data)
(set (make-local-variable 'colorcomp-ewoc) ewoc)
(ewoc-enter-last ewoc 0)
(ewoc-enter-last ewoc 1)
(ewoc-enter-last ewoc 2)
(ewoc-enter-last ewoc nil)))
This example can be extended to be a “color selection widget” (in
other words, the controller part of the “model/view/controller”
design paradigm) by defining commands to modify colorcomp-data
and to “finish” the selection process, and a keymap to tie it all
together conveniently.
(defun colorcomp-mod (index limit delta)
(let ((cur (aref colorcomp-data index)))
(unless (= limit cur)
(aset colorcomp-data index (+ cur delta)))
(ewoc-invalidate
colorcomp-ewoc
(ewoc-nth colorcomp-ewoc index)
(ewoc-nth colorcomp-ewoc -1))))
(defun colorcomp-R-more () (interactive) (colorcomp-mod 0 255 1))
(defun colorcomp-G-more () (interactive) (colorcomp-mod 1 255 1))
(defun colorcomp-B-more () (interactive) (colorcomp-mod 2 255 1))
(defun colorcomp-R-less () (interactive) (colorcomp-mod 0 0 -1))
(defun colorcomp-G-less () (interactive) (colorcomp-mod 1 0 -1))
(defun colorcomp-B-less () (interactive) (colorcomp-mod 2 0 -1))
(defun colorcomp-copy-as-kill-and-exit ()
"Copy the color components into the kill ring and kill the buffer.
The string is formatted #RRGGBB (hash followed by six hex digits)."
(interactive)
(kill-new (format "#%02X%02X%02X"
(aref colorcomp-data 0)
(aref colorcomp-data 1)
(aref colorcomp-data 2)))
(kill-buffer nil))
(setq colorcomp-mode-map
(let ((m (make-sparse-keymap)))
(suppress-keymap m)
(define-key m "i" 'colorcomp-R-less)
(define-key m "o" 'colorcomp-R-more)
(define-key m "k" 'colorcomp-G-less)
(define-key m "l" 'colorcomp-G-more)
(define-key m "," 'colorcomp-B-less)
(define-key m "." 'colorcomp-B-more)
(define-key m " " 'colorcomp-copy-as-kill-and-exit)
m))
Note that we never modify the data in each node, which is fixed when the
ewoc is created to be either nil or an index into the vector
colorcomp-data, the actual color components.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes the mechanism by which Emacs shows a matching open parenthesis when the user inserts a close parenthesis.
The value of this variable should be a function (of no arguments) to
be called whenever a character with close parenthesis syntax is inserted.
The value of blink-paren-function may be nil, in which
case nothing is done.
If this variable is nil, then blink-matching-open does
nothing.
This variable specifies the maximum distance to scan for a matching parenthesis before giving up.
This variable specifies the number of seconds to keep indicating the matching parenthesis. A fraction of a second often gives good results, but the default is 1, which works on all systems.
This function is the default value of blink-paren-function. It
assumes that point follows a character with close parenthesis syntax
and applies the appropriate effect momentarily to the matching opening
character. If that character is not already on the screen, it
displays the character’s context in the echo area. To avoid long
delays, this function does not search farther than
blink-matching-paren-distance characters.
Here is an example of calling this function explicitly.
(defun interactive-blink-matching-open () "Indicate momentarily the start of parenthesized sexp before point." (interactive)
(let ((blink-matching-paren-distance
(buffer-size))
(blink-matching-paren t))
(blink-matching-open)))
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes how characters are actually displayed by Emacs. Typically, a character is displayed as a glyph (a graphical symbol which occupies one character position on the screen), whose appearance corresponds to the character itself. For example, the character ‘a’ (character code 97) is displayed as ‘a’. Some characters, however, are displayed specially. For example, the formfeed character (character code 12) is usually displayed as a sequence of two glyphs, ‘^L’, while the newline character (character code 10) starts a new screen line.
You can modify how each character is displayed by defining a display table, which maps each character code into a sequence of glyphs. See section Display Tables.
| 37.21.1 Usual Display Conventions | The usual conventions for displaying characters. | |
| 37.21.2 Display Tables | What a display table consists of. | |
| 37.21.3 Active Display Table | How Emacs selects a display table to use. | |
| 37.21.4 Glyphs | How to define a glyph, and what glyphs mean. | |
| 37.21.5 Glyphless Character Display | How glyphless characters are drawn. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here are the conventions for displaying each character code (in the absence of a display table, which can override these conventions; see section Display Tables).
tab-width controls the number of
spaces per tab stop (see below).
ctl-arrow. If this variable is non-nil (the default),
these characters are displayed as sequences of two glyphs, where the
first glyph is ‘^’ (a display table can specify a glyph to use
instead of ‘^’); e.g., the DEL character is displayed as
‘^?’.
If ctl-arrow is nil, these characters are displayed as
octal escapes (see below).
This rule also applies to carriage return (character code 13), if that character appears in the buffer. But carriage returns usually do not appear in buffer text; they are eliminated as part of end-of-line conversion (see section Basic Concepts of Coding Systems).
The above display conventions apply even when there is a display
table, for any character whose entry in the active display table is
nil. Thus, when you set up a display table, you need only
specify the characters for which you want special behavior.
The following variables affect how certain characters are displayed
on the screen. Since they change the number of columns the characters
occupy, they also affect the indentation functions. They also affect
how the mode line is displayed; if you want to force redisplay of the
mode line using the new values, call the function
force-mode-line-update (see section Mode Line Format).
This buffer-local variable controls how control characters are
displayed. If it is non-nil, they are displayed as a caret
followed by the character: ‘^A’. If it is nil, they are
displayed as octal escapes: a backslash followed by three octal
digits, as in ‘\001’.
The value of this buffer-local variable is the spacing between tab
stops used for displaying tab characters in Emacs buffers. The value
is in units of columns, and the default is 8. Note that this feature
is completely independent of the user-settable tab stops used by the
command tab-to-tab-stop. See section Adjustable “Tab Stops”.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A display table is a special-purpose char-table
(see section Char-Tables), with display-table as its subtype, which
is used to override the usual character display conventions. This
section describes how to make, inspect, and assign elements to a
display table object.
This creates and returns a display table. The table initially has
nil in all elements.
The ordinary elements of the display table are indexed by character
codes; the element at index c says how to display the character
code c. The value should be nil (which means to display
the character c according to the usual display conventions;
see section Usual Display Conventions), or a vector of glyph codes (which means to
display the character c as those glyphs; see section Glyphs).
Warning: if you use the display table to change the display of newline characters, the whole buffer will be displayed as one long “line”.
The display table also has six “extra slots” which serve special
purposes. Here is a table of their meanings; nil in any slot
means to use the default for that slot, as stated below.
The glyph for the end of a truncated screen line (the default for this is ‘$’). See section Glyphs. On graphical terminals, Emacs uses arrows in the fringes to indicate truncation, so the display table has no effect.
The glyph for the end of a continued line (the default is ‘\’). On graphical terminals, Emacs uses curved arrows in the fringes to indicate continuation, so the display table has no effect.
The glyph for indicating a character displayed as an octal character code (the default is ‘\’).
The glyph for indicating a control character (the default is ‘^’).
A vector of glyphs for indicating the presence of invisible lines (the default is ‘...’). See section Selective Display.
The glyph used to draw the border between side-by-side windows (the default is ‘|’). See section Splitting Windows. This takes effect only when there are no scroll bars; if scroll bars are supported and in use, a scroll bar separates the two windows.
For example, here is how to construct a display table that mimics
the effect of setting ctl-arrow to a non-nil value
(see section Glyphs, for the function make-glyph-code):
(setq disptab (make-display-table))
(dotimes (i 32)
(or (= i ?\t)
(= i ?\n)
(aset disptab i
(vector (make-glyph-code ?^ 'escape-glyph)
(make-glyph-code (+ i 64) 'escape-glyph)))))
(aset disptab 127
(vector (make-glyph-code ?^ 'escape-glyph)
(make-glyph-code ?? 'escape-glyph)))))
This function returns the value of the extra slot slot of
display-table. The argument slot may be a number from 0 to
5 inclusive, or a slot name (symbol). Valid symbols are
truncation, wrap, escape, control,
selective-display, and vertical-border.
This function stores value in the extra slot slot of
display-table. The argument slot may be a number from 0 to
5 inclusive, or a slot name (symbol). Valid symbols are
truncation, wrap, escape, control,
selective-display, and vertical-border.
This function displays a description of the display table display-table in a help buffer.
This command displays a description of the current display table in a help buffer.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Each window can specify a display table, and so can each buffer.
The window’s display table, if there is one, takes precedence over the
buffer’s display table. If neither exists, Emacs tries to use the
standard display table; if that is nil, Emacs uses the usual
character display conventions (see section Usual Display Conventions).
Note that display tables affect how the mode line is displayed, so
if you want to force redisplay of the mode line using a new display
table, call force-mode-line-update (see section Mode Line Format).
This function returns window’s display table, or nil if
there is none. The default for window is the selected window.
This function sets the display table of window to table.
The argument table should be either a display table or
nil.
This variable is automatically buffer-local in all buffers; its value
specifies the buffer’s display table. If it is nil, there is
no buffer display table.
The value of this variable is the standard display table, which is
used when Emacs is displaying a buffer in a window with neither a
window display table nor a buffer display table defined. Its default
is nil.
The disp-table library defines several functions for changing the standard display table.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A glyph is a graphical symbol which occupies a single character position on the screen. Each glyph is represented in Lisp as a glyph code, which specifies a character and optionally a face to display it in (see section Faces). The main use of glyph codes is as the entries of display tables (see section Display Tables). The following functions are used to manipulate glyph codes:
This function returns a glyph code representing char char with
face face. If face is omitted or nil, the glyph
uses the default face; in that case, the glyph code is an integer. If
face is non-nil, the glyph code is not necessarily an
integer object.
This function returns the character of glyph code glyph.
This function returns face of glyph code glyph, or nil if
glyph uses the default face.
You can set up a glyph table to change how glyph codes are
actually displayed on text terminals. This feature is semi-obsolete;
use glyphless-char-display instead (see section Glyphless Character Display).
The value of this variable, if non-nil, is the current glyph
table. It takes effect only on character terminals; on graphical
displays, all glyphs are displayed literally. The glyph table should
be a vector whose gth element specifies how to display glyph
code g, where g is the glyph code for a glyph whose face
is unspecified. Each element should be one of the following:
nilDisplay this glyph literally.
Display this glyph by sending the specified string to the terminal.
Display the specified glyph code instead.
Any integer glyph code greater than or equal to the length of the glyph table is displayed literally.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Glyphless characters are characters which are displayed in a special way, e.g., as a box containing a hexadecimal code, instead of being displayed literally. These include characters which are explicitly defined to be glyphless, as well as characters for which there is no available font (on a graphical display), and characters which cannot be encoded by the terminal’s coding system (on a text terminal).
The value of this variable is a char-table which defines glyphless characters and how they are displayed. Each entry must be one of the following display methods:
nilDisplay the character in the usual way.
zero-widthDon’t display the character.
thin-spaceDisplay a thin space, 1-pixel wide on graphical displays, or 1-character wide on text terminals.
empty-boxDisplay an empty box.
hex-codeDisplay a box containing the Unicode codepoint of the character, in hexadecimal notation.
Display a box containing that string.
(graphical . text)Display with graphical on graphical displays, and with text on text terminals. Both graphical and text must be one of the display methods described above.
The thin-space, empty-box, hex-code, and
ASCII string display methods are drawn with the
glyphless-char face.
The char-table has one extra slot, which determines how to display any
character that cannot be displayed with any available font, or cannot
be encoded by the terminal’s coding system. Its value should be one
of the above display methods, except zero-width or a cons cell.
If a character has a non-nil entry in an active display table,
the display table takes effect; in this case, Emacs does not consult
glyphless-char-display at all.
This user option provides a convenient way to set
glyphless-char-display for groups of similar characters. Do
not set its value directly from Lisp code; the value takes effect only
via a custom :set function (see section Defining Customization Variables),
which updates glyphless-char-display.
Its value should be an alist of elements (group
. method), where group is a symbol specifying a group of
characters, and method is a symbol specifying how to display
them.
group should be one of the following:
c0-controlASCII control characters U+0000 to U+001F,
excluding the newline and tab characters (normally displayed as escape
sequences like ‘^A’; see How Text Is Displayed in The GNU Emacs Manual).
c1-controlNon-ASCII, non-printing characters U+0080 to
U+009F (normally displayed as octal escape sequences like
‘\230’).
format-controlCharacters of Unicode General Category ‘Cf’, such as ‘U+200E’ (Left-to-Right Mark), but excluding characters that have graphic images, such as ‘U+00AD’ (Soft Hyphen).
no-fontCharacters for there is no suitable font, or which cannot be encoded by the terminal’s coding system.
The method symbol should be one of zero-width,
thin-space, empty-box, or hex-code. These have
the same meanings as in glyphless-char-display, above.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes how to make Emacs ring the bell (or blink the screen) to attract the user’s attention. Be conservative about how often you do this; frequent bells can become irritating. Also be careful not to use just beeping when signaling an error is more appropriate (see section Errors).
This function beeps, or flashes the screen (see visible-bell below).
It also terminates any keyboard macro currently executing unless
do-not-terminate is non-nil.
This is a synonym for ding.
This variable determines whether Emacs should flash the screen to
represent a bell. Non-nil means yes, nil means no.
This is effective on graphical displays, and on text terminals
provided the terminal’s Termcap entry defines the visible bell
capability (‘vb’).
If this is non-nil, it specifies how Emacs should “ring the
bell”. Its value should be a function of no arguments. If this is
non-nil, it takes precedence over the visible-bell
variable.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs works with several window systems, most notably the X Window System. Both Emacs and X use the term “window”, but use it differently. An Emacs frame is a single window as far as X is concerned; the individual Emacs windows are not known to X at all.
This terminal-local variable tells Lisp programs what window system Emacs is using for displaying the frame. The possible values are
xEmacs is displaying the frame using X.
w32Emacs is displaying the frame using native MS-Windows GUI.
nsEmacs is displaying the frame using the Nextstep interface (used on GNUstep and Mac OS X).
pcEmacs is displaying the frame using MS-DOS direct screen writes.
nilEmacs is displaying the frame on a character-based terminal.
This variable holds the value of window-system used for the
first frame created by Emacs during startup. (When Emacs is invoked
with the --daemon option, it does not create any initial
frames, so initial-window-system is nil. See daemon in The GNU Emacs Manual.)
This function returns a symbol whose name tells what window system is
used for displaying frame (which defaults to the currently
selected frame). The list of possible symbols it returns is the same
one documented for the variable window-system above.
Do not use window-system and
initial-window-system as predicates or boolean flag variables,
if you want to write code that works differently on text terminals and
graphic displays. That is because window-system is not a good
indicator of Emacs capabilities on a given display type. Instead, use
display-graphic-p or any of the other display-*-p
predicates described in Display Feature Testing.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs can display text written in scripts, such as Arabic, Farsi, and Hebrew, whose natural ordering for horizontal text display runs from right to left. Furthermore, segments of Latin script and digits embedded in right-to-left text are displayed left-to-right, while segments of right-to-left script embedded in left-to-right text (e.g., Arabic or Hebrew text in comments or strings in a program source file) are appropriately displayed right-to-left. We call such mixtures of left-to-right and right-to-left text bidirectional text. This section describes the facilities and options for editing and displaying bidirectional text.
Text is stored in Emacs buffers and strings in logical (or reading) order, i.e., the order in which a human would read each character. In right-to-left and bidirectional text, the order in which characters are displayed on the screen (called visual order) is not the same as logical order; the characters’ screen positions do not increase monotonically with string or buffer position. In performing this bidirectional reordering, Emacs follows the Unicode Bidirectional Algorithm (a.k.a. UBA), which is described in Annex #9 of the Unicode standard (http://www.unicode.org/reports/tr9/). Emacs currently provides a “Non-isolate Bidirectionality” class implementation of the UBA: it does not yet support the isolate directional formatting characters introduced with Unicode Standard v6.3.0.
If the value of this buffer-local variable is non-nil (the
default), Emacs performs bidirectional reordering for display. The
reordering affects buffer text, as well as display strings and overlay
strings from text and overlay properties in the buffer (see section Overlay Properties, and see section The display Property). If the value is
nil, Emacs does not perform bidirectional reordering in the
buffer.
The default value of bidi-display-reordering controls the
reordering of strings which are not directly supplied by a buffer,
including the text displayed in mode lines (see section Mode Line Format)
and header lines (see section Window Header Lines).
Emacs never reorders the text of a unibyte buffer, even if
bidi-display-reordering is non-nil in the buffer. This
is because unibyte buffers contain raw bytes, not characters, and thus
lack the directionality properties required for reordering.
Therefore, to test whether text in a buffer will be reordered for
display, it is not enough to test the value of
bidi-display-reordering alone. The correct test is this:
(if (and enable-multibyte-characters
bidi-display-reordering)
;; Buffer is being reordered for display
)
However, unibyte display and overlay strings are reordered if their parent buffer is reordered. This is because plain-ASCII strings are stored by Emacs as unibyte strings. If a unibyte display or overlay string includes non-ASCII characters, these characters are assumed to have left-to-right direction.
Text covered by display text properties, by overlays with
display properties whose value is a string, and by any other
properties that replace buffer text, is treated as a single unit when
it is reordered for display. That is, the entire chunk of text
covered by these properties is reordered together. Moreover, the
bidirectional properties of the characters in such a chunk of text are
ignored, and Emacs reorders them as if they were replaced with a
single character U+FFFC, known as the Object Replacement
Character. This means that placing a display property over a portion
of text may change the way that the surrounding text is reordered for
display. To prevent this unexpected effect, always place such
properties on text whose directionality is identical with text that
surrounds it.
Each paragraph of bidirectional text has a base direction, either right-to-left or left-to-right. Left-to-right paragraphs are displayed beginning at the left margin of the window, and are truncated or continued when the text reaches the right margin. Right-to-left paragraphs are displayed beginning at the right margin, and are continued or truncated at the left margin.
By default, Emacs determines the base direction of each paragraph by looking at the text at its beginning. The precise method of determining the base direction is specified by the UBA; in a nutshell, the first character in a paragraph that has an explicit directionality determines the base direction of the paragraph. However, sometimes a buffer may need to force a certain base direction for its paragraphs. For example, buffers containing program source code should force all paragraphs to be displayed left-to-right. You can use following variable to do this:
If the value of this buffer-local variable is the symbol
right-to-left or left-to-right, all paragraphs in the
buffer are assumed to have that specified direction. Any other value
is equivalent to nil (the default), which means to determine
the base direction of each paragraph from its contents.
Modes for program source code should set this to left-to-right.
Prog mode does this by default, so modes derived from Prog mode do not
need to set this explicitly (see section Basic Major Modes).
This function returns the paragraph direction at point in the named
buffer. The returned value is a symbol, either
left-to-right or right-to-left. If buffer is
omitted or nil, it defaults to the current buffer. If the
buffer-local value of the variable bidi-paragraph-direction is
non-nil, the returned value will be identical to that value;
otherwise, the returned value reflects the paragraph direction
determined dynamically by Emacs. For buffers whose value of
bidi-display-reordering is nil as well as unibyte
buffers, this function always returns left-to-right.
Sometimes there’s a need to move point in strict visual order, either to the left or to the right of its current screen position. Emacs provides a primitive to do that.
This function moves point of the currently selected window to the buffer position that appears immediately to the right or to the left of point on the screen. If direction is positive, point will move one screen position to the right, otherwise it will move one screen position to the left. Note that, depending on the surrounding bidirectional context, this could potentially move point many buffer positions away. If invoked at the end of a screen line, the function moves point to the rightmost or leftmost screen position of the next or previous screen line, as appropriate for the value of direction.
The function returns the new buffer position as its value.
Bidirectional reordering can have surprising and unpleasant effects when two strings with bidirectional content are juxtaposed in a buffer, or otherwise programmatically concatenated into a string of text. A typical problematic case is when a buffer consists of sequences of text “fields” separated by whitespace or punctuation characters, like Buffer Menu mode or Rmail Summary Mode. Because the punctuation characters used as separators have weak directionality, they take on the directionality of surrounding text. As result, a numeric field that follows a field with bidirectional content can be displayed to the left of the preceding field, messing up the expected layout. There are several ways to avoid this problem:
U+200E, LEFT-TO-RIGHT MARK, or
LRM, to the end of each field that may have bidirectional
content, or prepend it to the beginning of the following field. The
function bidi-string-mark-left-to-right, described below, comes
in handy for this purpose. (In a right-to-left paragraph, use
U+200F, RIGHT-TO-LEFT MARK, or RLM, instead.) This
is one of the solutions recommended by the UBA.
display property or overlay with a
property value of the form (space . PROPS) (see section Specified Spaces). Emacs treats this display specification as a paragraph
separator, and reorders the text on either side separately.
This function returns its argument string, possibly modified,
such that the result can be safely concatenated with another string,
or juxtaposed with another string in a buffer, without disrupting the
relative layout of this string and the next one on display. If the
string returned by this function is displayed as part of a
left-to-right paragraph, it will always appear on display to the left
of the text that follows it. The function works by examining the
characters of its argument, and if any of those characters could cause
reordering on display, the function appends the LRM
character to the string. The appended LRM character is made
invisible by giving it an invisible text property of t
(see section Invisible Text).
The reordering algorithm uses the bidirectional properties of the
characters stored as their bidi-class property
(see section Character Properties). Lisp programs can change these
properties by calling the put-char-code-property function.
However, doing this requires a thorough understanding of the
UBA, and is therefore not recommended. Any changes to the
bidirectional properties of a character have global effect: they
affect all Emacs frames and windows.
Similarly, the mirroring property is used to display the
appropriate mirrored character in the reordered text. Lisp programs
can affect the mirrored display by changing this property. Again, any
such changes affect all of Emacs display.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This chapter is about starting and getting out of Emacs, access to values in the operating system environment, and terminal input, output.
See section Building Emacs, for related information. See section Emacs Display, for additional operating system status information pertaining to the terminal and the screen.
| 38.1 Starting Up Emacs | Customizing Emacs startup processing. | |
| 38.2 Getting Out of Emacs | How exiting works (permanent or temporary). | |
| 38.3 Operating System Environment | Distinguish the name and kind of system. | |
| 38.4 User Identification | Finding the name and user id of the user. | |
| 38.5 Time of Day | Getting the current time. | |
| 38.6 Time Conversion | Converting a time from numeric form to calendrical data and vice versa. | |
| 38.7 Parsing and Formatting Times | Converting a time from numeric form to text and vice versa. | |
| 38.8 Processor Run time | Getting the run time used by Emacs. | |
| 38.9 Time Calculations | Adding, subtracting, comparing times, etc. | |
| 38.10 Timers for Delayed Execution | Setting a timer to call a function at a certain time. | |
| 38.11 Idle Timers | Setting a timer to call a function when Emacs has been idle for a certain length of time. | |
| 38.12 Terminal Input | Accessing and recording terminal input. | |
| 38.13 Terminal Output | Controlling and recording terminal output. | |
| 38.14 Sound Output | Playing sounds on the computer’s speaker. | |
| 38.15 Operating on X11 Keysyms | Operating on key symbols for X Windows. | |
| 38.16 Batch Mode | Running Emacs without terminal interaction. | |
| 38.17 Session Management | Saving and restoring state with X Session Management. | |
| 38.18 Desktop Notifications | Desktop notifications. | |
| 38.19 Notifications on File Changes | File notifications. | |
| 38.20 Dynamically Loaded Libraries | On-demand loading of support libraries. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes what Emacs does when it is started, and how you can customize these actions.
| 38.1.1 Summary: Sequence of Actions at Startup | Sequence of actions Emacs performs at startup. | |
| 38.1.2 The Init File | Details on reading the init file. | |
| 38.1.3 Terminal-Specific Initialization | How the terminal-specific Lisp file is read. | |
| 38.1.4 Command-Line Arguments | How command-line arguments are processed, and how you can customize them. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When Emacs is started up, it performs the following operations
(see normal-top-level in startup.el):
load-path, by running the file named
subdirs.el in each directory in the list. Normally, this file
adds the directory’s subdirectories to the list, and those are scanned
in their turn. The files subdirs.el are normally generated
automatically when Emacs is installed.
load-path
directories. This file is intended for registering input methods.
The search is only for any personal leim-list.el files that you
may have created; it skips the directories containing the standard Emacs
libraries (these should contain only a single leim-list.el file,
which is compiled into the Emacs executable).
before-init-time to the value of
current-time (see section Time of Day). It also sets
after-init-time to nil, which signals to Lisp programs
that Emacs is being initialized.
LANG.
initial-window-system specifies (see section initial-window-system). The initialization function for
each supported window system is specified by
window-system-initialization-alist. If the value
of initial-window-system is windowsystem, then the
appropriate initialization function is defined in the file
term/windowsystem-win.el. This file should have been
compiled into the Emacs executable when it was built.
before-init-hook.
custom-reevaluate-setting to re-initialize the members
of the list custom-delayed-init-variables. These are any
pre-loaded user options whose default value depends on the run-time,
rather than build-time, context.
See section custom-initialize-delay.
inhibit-default-init is non-nil, nor if the options
‘-q’, ‘-Q’, or ‘--batch’ were specified.
abbrev-file-name, if that file exists and can be read
(see section abbrev-file-name). This is not done if the
option ‘--batch’ was specified.
package-enable-at-startup is non-nil, it calls the
function package-initialize to activate any optional Emacs Lisp
package that has been installed. See section Packaging Basics.
after-init-time to the value of
current-time. This variable was set to nil earlier;
setting it to the current time signals that the initialization phase
is over, and, together with before-init-time, provides the
measurement of how long it took.
after-init-hook.
initial-major-mode.
tty-setup-hook. This is not done
in --batch mode, nor if term-file-prefix is nil.
inhibit-startup-echo-area-message.
--batch was specified.
initial-buffer-choice is a string, it visits the file (or
directory) with that name. If it is a function, it calls the function
with no arguments and selects the buffer that it returns.
If the *scratch* buffer exists and is empty, it inserts
initial-scratch-message into that buffer.
emacs-startup-hook.
frame-notice-user-settings, which modifies the
parameters of the selected frame according to whatever the init files
specify.
window-setup-hook. The only difference between this
hook and emacs-startup-hook is that this one runs after the
previously mentioned modifications to the frame parameters.
inhibit-startup-screen or initial-buffer-choice
are non-nil, or if the ‘--no-splash’ or ‘-Q’ command-line
options were specified.
--daemon was specified, it calls
server-start and detaches from the controlling terminal.
See Emacs Server in The GNU Emacs Manual.
emacs-session-restore passing it as argument the ID of the
previous session. See section Session Management.
The following options affect some aspects of the startup sequence.
This variable, if non-nil, inhibits the startup screen. In
that case, Emacs typically displays the *scratch* buffer; but
see initial-buffer-choice, below.
Do not set this variable in the init file of a new user, or in a way that affects more than one user, as that would prevent new users from receiving information about copyleft and basic Emacs usage.
inhibit-startup-message and inhibit-splash-screen are
aliases for this variable.
If non-nil, this variable is a string that specifies a file or
directory for Emacs to display after starting up, instead of the
startup screen.
If its value is a function, Emacs calls that function which must
return a buffer which is then displayed.
If its value is t, Emacs displays the *scratch* buffer.
This variable controls the display of the startup echo area message. You can suppress the startup echo area message by adding text with this form to your init file:
(setq inhibit-startup-echo-area-message
"your-login-name")
Emacs explicitly checks for an expression as shown above in your init
file; your login name must appear in the expression as a Lisp string
constant. You can also use the Customize interface. Other methods of
setting inhibit-startup-echo-area-message to the same value do
not inhibit the startup message. This way, you can easily inhibit the
message for yourself if you wish, but thoughtless copying of your init
file will not inhibit the message for someone else.
This variable, if non-nil, should be a string, which is
inserted into the *scratch* buffer when Emacs starts up. If it
is nil, the *scratch* buffer is empty.
The following command-line options affect some aspects of the startup sequence. See Initial Options in The GNU Emacs Manual.
--no-splashDo not display a splash screen.
--batchRun without an interactive terminal. See section Batch Mode.
--daemonDo not initialize any display; just start a server in the background.
--no-init-file-qDo not load either the init file, or the default library.
--no-site-fileDo not load the site-start library.
--quick-QEquivalent to ‘-q --no-site-file --no-splash’.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When you start Emacs, it normally attempts to load your init file. This is either a file named .emacs or .emacs.el in your home directory, or a file named init.el in a subdirectory named .emacs.d in your home directory.
The command-line switches ‘-q’, ‘-Q’, and ‘-u’
control whether and where to find the init file; ‘-q’ (and the
stronger ‘-Q’) says not to load an init file, while ‘-u
user’ says to load user’s init file instead of yours.
See Entering Emacs in The GNU Emacs Manual. If neither
option is specified, Emacs uses the LOGNAME environment
variable, or the USER (most systems) or USERNAME (MS
systems) variable, to find your home directory and thus your init
file; this way, even if you have su’d, Emacs still loads your own init
file. If those environment variables are absent, though, Emacs uses
your user-id to find your home directory.
An Emacs installation may have a default init file, which is a
Lisp library named default.el. Emacs finds this file through
the standard search path for libraries (see section How Programs Do Loading). The Emacs distribution does not come with this file; it is
intended for local customizations. If the default init file exists,
it is loaded whenever you start Emacs. But your own personal init
file, if any, is loaded first; if it sets inhibit-default-init
to a non-nil value, then Emacs does not subsequently load the
default.el file. In batch mode, or if you specify ‘-q’
(or ‘-Q’), Emacs loads neither your personal init file nor
the default init file.
Another file for site-customization is site-start.el. Emacs loads this before the user’s init file. You can inhibit the loading of this file with the option ‘--no-site-file’.
This variable specifies the site-customization file to load before the
user’s init file. Its normal value is "site-start". The only
way you can change it with real effect is to do so before dumping
Emacs.
See Init File Examples in The GNU Emacs Manual, for examples of how to make various commonly desired customizations in your .emacs file.
If this variable is non-nil, it prevents Emacs from loading the
default initialization library file. The default value is nil.
This normal hook is run, once, just before loading all the init files (site-start.el, your init file, and default.el). (The only way to change it with real effect is before dumping Emacs.)
This normal hook is run, once, just after loading all the init files (site-start.el, your init file, and default.el), before loading the terminal-specific library (if started on a text terminal) and processing the command-line action arguments.
This normal hook is run, once, just after handling the command line arguments. In batch mode, Emacs does not run this hook.
This normal hook is very similar to emacs-startup-hook.
The only difference is that it runs slightly later, after setting
of the frame parameters. See section window-setup-hook.
This variable holds the absolute file name of the user’s init file. If the actual init file loaded is a compiled file, such as .emacs.elc, the value refers to the corresponding source file.
This variable holds the name of the .emacs.d directory. It is ~/.emacs.d on all platforms but MS-DOS.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Each terminal type can have its own Lisp library that Emacs loads when
run on that type of terminal. The library’s name is constructed by
concatenating the value of the variable term-file-prefix and the
terminal type (specified by the environment variable TERM).
Normally, term-file-prefix has the value
"term/"; changing this is not recommended. Emacs finds the file
in the normal manner, by searching the load-path directories, and
trying the ‘.elc’ and ‘.el’ suffixes.
The usual role of a terminal-specific library is to enable special
keys to send sequences that Emacs can recognize. It may also need to
set or add to input-decode-map if the Termcap or Terminfo entry
does not specify all the terminal’s function keys. See section Terminal Input.
When the name of the terminal type contains a hyphen or underscore,
and no library is found whose name is identical to the terminal’s
name, Emacs strips from the terminal’s name the last hyphen or
underscore and everything that follows
it, and tries again. This process is repeated until Emacs finds a
matching library, or until there are no more hyphens or underscores in the name
(i.e., there is no terminal-specific library). For example, if the
terminal name is ‘xterm-256color’ and there is no
term/xterm-256color.el library, Emacs tries to load
term/xterm.el. If necessary, the terminal library can evaluate
(getenv "TERM") to find the full name of the terminal type.
Your init file can prevent the loading of the terminal-specific
library by setting the variable term-file-prefix to nil.
You can also arrange to override some of the actions of the
terminal-specific library by using tty-setup-hook. This is
a normal hook that Emacs runs after initializing a new text terminal.
You could use this hook to define initializations for terminals that do not
have their own libraries. See section Hooks.
If the value of this variable is non-nil, Emacs loads a
terminal-specific initialization file as follows:
(load (concat term-file-prefix (getenv "TERM")))
You may set the term-file-prefix variable to nil in your
init file if you do not wish to load the
terminal-initialization file.
On MS-DOS, Emacs sets the TERM environment variable to ‘internal’.
This variable is a normal hook that Emacs runs after initializing a
new text terminal. (This applies when Emacs starts up in non-windowed
mode, and when making a tty emacsclient connection.) The
hook runs after loading your init file (if applicable) and the
terminal-specific Lisp file, so you can use it to adjust the
definitions made by that file.
For a related feature, see section window-setup-hook.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can use command-line arguments to request various actions when you start Emacs. Note that the recommended way of using Emacs is to start it just once, after logging in, and then do all editing in the same Emacs session (see Entering Emacs in The GNU Emacs Manual). For this reason, you might not use command-line arguments very often; nonetheless, they can be useful when invoking Emacs from session scripts or debugging Emacs. This section describes how Emacs processes command-line arguments.
This function parses the command line that Emacs was called with, processes it, and (amongst other things) loads the user’s init file and displays the startup messages.
The value of this variable is t once the command line has been
processed.
If you redump Emacs by calling dump-emacs (see section Building Emacs), you may wish to set this variable to nil first in
order to cause the new dumped Emacs to process its new command-line
arguments.
This variable is an alist of user-defined command-line options and associated handler functions. By default it is empty, but you can add elements if you wish.
A command-line option is an argument on the command line, which has the form:
-option
The elements of the command-switch-alist look like this:
(option . handler-function)
The CAR, option, is a string, the name of a command-line option (not including the initial hyphen). The handler-function is called to handle option, and receives the option name as its sole argument.
In some cases, the option is followed in the command line by an
argument. In these cases, the handler-function can find all the
remaining command-line arguments in the variable
command-line-args-left (see below). (The entire list of
command-line arguments is in command-line-args.)
The command-line arguments are parsed by the command-line-1
function in the startup.el file. See also Command Line Arguments for Emacs Invocation in The
GNU Emacs Manual.
The value of this variable is the list of command-line arguments passed to Emacs.
The value of this variable is the list of command-line arguments that have not yet been processed.
This variable’s value is a list of functions for handling an
unrecognized command-line argument. Each time the next argument to be
processed has no special meaning, the functions in this list are called,
in order of appearance, until one of them returns a non-nil
value.
These functions are called with no arguments. They can access the
command-line argument under consideration through the variable
argi, which is bound temporarily at this point. The remaining
arguments (not including the current one) are in the variable
command-line-args-left.
When a function recognizes and processes the argument in argi, it
should return a non-nil value to say it has dealt with that
argument. If it has also dealt with some of the following arguments, it
can indicate that by deleting them from command-line-args-left.
If all of these functions return nil, then the argument is treated
as a file name to visit.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
There are two ways to get out of Emacs: you can kill the Emacs job, which exits permanently, or you can suspend it, which permits you to reenter the Emacs process later. (In a graphical environment, you can of course simply switch to another application without doing anything special to Emacs, then switch back to Emacs when you want.)
| 38.2.1 Killing Emacs | Exiting Emacs irreversibly. | |
| 38.2.2 Suspending Emacs | Exiting Emacs reversibly. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Killing Emacs means ending the execution of the Emacs process.
If you started Emacs from a terminal, the parent process normally
resumes control. The low-level primitive for killing Emacs is
kill-emacs.
This command calls the hook kill-emacs-hook, then exits the
Emacs process and kills it.
If exit-data is an integer, that is used as the exit status of the Emacs process. (This is useful primarily in batch operation; see Batch Mode.)
If exit-data is a string, its contents are stuffed into the terminal input buffer so that the shell (or whatever program next reads input) can read them.
The kill-emacs function is normally called via the
higher-level command C-x C-c
(save-buffers-kill-terminal). See Exiting in The GNU
Emacs Manual. It is also called automatically if Emacs receives a
SIGTERM or SIGHUP operating system signal (e.g., when the
controlling terminal is disconnected), or if it receives a
SIGINT signal while running in batch mode (see section Batch Mode).
This normal hook is run by kill-emacs, before it kills Emacs.
Because kill-emacs can be called in situations where user
interaction is impossible (e.g., when the terminal is disconnected),
functions on this hook should not attempt to interact with the user.
If you want to interact with the user when Emacs is shutting down, use
kill-emacs-query-functions, described below.
When Emacs is killed, all the information in the Emacs process,
aside from files that have been saved, is lost. Because killing Emacs
inadvertently can lose a lot of work, the
save-buffers-kill-terminal command queries for confirmation if
you have buffers that need saving or subprocesses that are running.
It also runs the abnormal hook kill-emacs-query-functions:
When save-buffers-kill-terminal is killing Emacs, it calls the
functions in this hook, after asking the standard questions and before
calling kill-emacs. The functions are called in order of
appearance, with no arguments. Each function can ask for additional
confirmation from the user. If any of them returns nil,
save-buffers-kill-emacs does not kill Emacs, and does not run
the remaining functions in this hook. Calling kill-emacs
directly does not run this hook.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
On text terminals, it is possible to suspend Emacs, which
means stopping Emacs temporarily and returning control to its superior
process, which is usually the shell. This allows you to resume
editing later in the same Emacs process, with the same buffers, the
same kill ring, the same undo history, and so on. To resume Emacs,
use the appropriate command in the parent shell—most likely
fg.
Suspending works only on a terminal device from which the Emacs session was started. We call that device the controlling terminal of the session. Suspending is not allowed if the controlling terminal is a graphical terminal. Suspending is usually not relevant in graphical environments, since you can simply switch to another application without doing anything special to Emacs.
Some operating systems (those without SIGTSTP, or MS-DOS) do
not support suspension of jobs; on these systems, “suspension”
actually creates a new shell temporarily as a subprocess of Emacs.
Then you would exit the shell to return to Emacs.
This function stops Emacs and returns control to the superior process.
If and when the superior process resumes Emacs, suspend-emacs
returns nil to its caller in Lisp.
This function works only on the controlling terminal of the Emacs
session; to relinquish control of other tty devices, use
suspend-tty (see below). If the Emacs session uses more than
one terminal, you must delete the frames on all the other terminals
before suspending Emacs, or this function signals an error.
See section Multiple Terminals.
If string is non-nil, its characters are sent to Emacs’s
superior shell, to be read as terminal input.
The characters in string are not echoed by the superior shell;
only the results appear.
Before suspending, suspend-emacs runs the normal hook
suspend-hook. After the user resumes Emacs,
suspend-emacs runs the normal hook suspend-resume-hook.
See section Hooks.
The next redisplay after resumption will redraw the entire screen,
unless the variable no-redraw-on-reenter is non-nil.
See section Refreshing the Screen.
Here is an example of how you could use these hooks:
(add-hook 'suspend-hook
(lambda () (or (y-or-n-p "Really suspend? ")
(error "Suspend canceled"))))
(add-hook 'suspend-resume-hook (lambda () (message "Resumed!")
(sit-for 2)))
Here is what you would see upon evaluating (suspend-emacs "pwd"):
---------- Buffer: Minibuffer ---------- Really suspend? y ---------- Buffer: Minibuffer ----------
---------- Parent Shell ---------- bash$ /home/username bash$ fg
---------- Echo Area ---------- Resumed!
Note that ‘pwd’ is not echoed after Emacs is suspended. But it is read and executed by the shell.
This variable is a normal hook that Emacs runs before suspending.
This variable is a normal hook that Emacs runs on resuming after a suspension.
If tty specifies a terminal device used by Emacs, this function
relinquishes the device and restores it to its prior state. Frames
that used the device continue to exist, but are not updated and Emacs
doesn’t read input from them. tty can be a terminal object, a
frame (meaning the terminal for that frame), or nil (meaning
the terminal for the selected frame). See section Multiple Terminals.
If tty is already suspended, this function does nothing.
This function runs the hook suspend-tty-functions, passing the
terminal object as an argument to each function.
This function resumes the previously suspended terminal device
tty; where tty has the same possible values as it does
for suspend-tty.
This function reopens the terminal device, re-initializes it, and
redraws it with that terminal’s selected frame. It then runs the
hook resume-tty-functions, passing the terminal object as an
argument to each function.
If the same device is already used by another Emacs terminal, this function signals an error. If tty is not suspended, this function does nothing.
This function returns non-nil if tty is the
controlling terminal of the Emacs session; tty can be a
terminal object, a frame (meaning the terminal for that frame), or
nil (meaning the terminal for the selected frame).
This command suspends a frame. For GUI frames, it calls
iconify-frame (see section Visibility of Frames); for frames on
text terminals, it calls either suspend-emacs or
suspend-tty, depending on whether the frame is displayed on the
controlling terminal device or not.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs provides access to variables in the operating system environment through various functions. These variables include the name of the system, the user’s UID, and so on.
This variable holds the standard GNU configuration name for the hardware/software configuration of your system, as a string. For example, a typical value for a 64-bit GNU/Linux system is ‘"x86_64-unknown-linux-gnu"’.
The value of this variable is a symbol indicating the type of operating system Emacs is running on. The possible values are:
aixIBM’s AIX.
berkeley-unixBerkeley BSD and its variants.
cygwinCygwin, a Posix layer on top of MS-Windows.
darwinDarwin (Mac OS X).
gnuThe GNU system (using the GNU kernel, which consists of the HURD and Mach).
gnu/linuxA GNU/Linux system—that is, a variant GNU system, using the Linux kernel. (These systems are the ones people often call “Linux”, but actually Linux is just the kernel, not the whole system.)
gnu/kfreebsdA GNU (glibc-based) system with a FreeBSD kernel.
hpuxHewlett-Packard HPUX operating system.
irixSilicon Graphics Irix system.
ms-dosMicrosoft’s DOS. Emacs compiled with DJGPP for MS-DOS binds
system-type to ms-dos even when you run it on MS-Windows.
usg-unix-vAT&T Unix System V.
windows-ntMicrosoft Windows NT, 9X and later. The value of system-type
is always windows-nt, e.g., even on Windows 7.
We do not wish to add new symbols to make finer distinctions unless it
is absolutely necessary! In fact, we hope to eliminate some of these
alternatives in the future. If you need to make a finer distinction
than system-type allows for, you can test
system-configuration, e.g., against a regexp.
This function returns the name of the machine you are running on, as a string.
The symbol system-name is a variable as well as a function. In
fact, the function returns whatever value the variable
system-name currently holds. Thus, you can set the variable
system-name in case Emacs is confused about the name of your
system. The variable is also useful for constructing frame titles
(see section Frame Titles).
If this variable is non-nil, it is used instead of
system-name for purposes of generating email addresses. For
example, it is used when constructing the default value of
user-mail-address. See section User Identification. (Since this is
done when Emacs starts up, the value actually used is the one saved when
Emacs was dumped. See section Building Emacs.)
This function returns the value of the environment variable var,
as a string. var should be a string. If var is undefined
in the environment, getenv returns nil. It returns
‘""’ if var is set but null. Within Emacs, a list of environment
variables and their values is kept in the variable process-environment.
(getenv "USER")
⇒ "lewis"
The shell command printenv prints all or part of the environment:
bash$ printenv PATH=/usr/local/bin:/usr/bin:/bin USER=lewis
TERM=xterm SHELL=/bin/bash HOME=/home/lewis
…
This command sets the value of the environment variable named
variable to value. variable should be a string.
Internally, Emacs Lisp can handle any string. However, normally
variable should be a valid shell identifier, that is, a sequence
of letters, digits and underscores, starting with a letter or
underscore. Otherwise, errors may occur if subprocesses of Emacs try
to access the value of variable. If value is omitted or
nil (or, interactively, with a prefix argument), setenv
removes variable from the environment. Otherwise, value
should be a string.
If the optional argument substitute is non-nil, Emacs
calls the function substitute-env-vars to expand any
environment variables in value.
setenv works by modifying process-environment; binding
that variable with let is also reasonable practice.
setenv returns the new value of variable, or nil
if it removed variable from the environment.
This variable is a list of strings, each describing one environment
variable. The functions getenv and setenv work by means
of this variable.
process-environment
⇒ ("PATH=/usr/local/bin:/usr/bin:/bin"
"USER=lewis"
"TERM=xterm"
"SHELL=/bin/bash"
"HOME=/home/lewis"
…)
If process-environment contains “duplicate” elements that
specify the same environment variable, the first of these elements
specifies the variable, and the other “duplicates” are ignored.
This variable holds the list of environment variables Emacs inherited from its parent process when Emacs started.
This variable holds a string that says which character separates
directories in a search path (as found in an environment variable). Its
value is ":" for Unix and GNU systems, and ";" for MS systems.
This function takes a search path string such as the value of
the PATH environment variable, and splits it at the separators,
returning a list of directory names. nil in this list means
the current directory. Although the function’s name says
“colon”, it actually uses the value of path-separator.
(parse-colon-path ":/foo:/bar")
⇒ (nil "/foo/" "/bar/")
This variable holds the program name under which Emacs was invoked. The value is a string, and does not include a directory name.
This variable holds the directory from which the Emacs executable was
invoked, or nil if that directory cannot be determined.
If non-nil, this is a directory within which to look for the
lib-src and etc subdirectories. In an installed Emacs,
it is normally nil. It is non-nil
when Emacs can’t find those directories in their standard installed
locations, but can find them in a directory related somehow to the one
containing the Emacs executable (i.e., invocation-directory).
This function returns the current 1-minute, 5-minute, and 15-minute system load averages, in a list. The load average indicates the number of processes trying to run on the system.
By default, the values are integers that are 100 times the system load
averages, but if use-float is non-nil, then they are
returned as floating-point numbers without multiplying by 100.
If it is impossible to obtain the load average, this function signals an error. On some platforms, access to load averages requires installing Emacs as setuid or setgid so that it can read kernel information, and that usually isn’t advisable.
If the 1-minute load average is available, but the 5- or 15-minute averages are not, this function returns a shortened list containing the available averages.
(load-average)
⇒ (169 48 36)
(load-average t)
⇒ (1.69 0.48 0.36)
The shell command uptime returns similar information.
This function returns the process ID of the Emacs process, as an integer.
This variable holds the erase character that was selected in the system’s terminal driver, before Emacs was started.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This variable says which user’s init files should be used by
Emacs—or nil if none. "" stands for the user who
originally logged in. The value reflects command-line options such as
‘-q’ or ‘-u user’.
Lisp packages that load files of customizations, or any other sort of
user profile, should obey this variable in deciding where to find it.
They should load the profile of the user name found in this variable.
If init-file-user is nil, meaning that the ‘-q’,
‘-Q’, or ‘-batch’ option was used, then Lisp packages should
not load any customization files or user profile.
This holds the nominal email address of the user who is using Emacs. Emacs normally sets this variable to a default value after reading your init files, but not if you have already set it. So you can set the variable to some other value in your init file if you do not want to use the default value.
This function returns the name under which the user is logged in.
It uses the environment variables LOGNAME or USER if
either is set. Otherwise, the value is based on the effective
UID, not the real UID.
If you specify uid (a number), the result is the user name that
corresponds to uid, or nil if there is no such user.
This function returns the user name corresponding to Emacs’s real
UID. This ignores the effective UID, and the
environment variables LOGNAME and USER.
This function returns the full name of the logged-in user—or the value
of the environment variable NAME, if that is set.
If the Emacs process’s user-id does not correspond to any known user (and
provided NAME is not set), the result is "unknown".
If uid is non-nil, then it should be a number (a user-id)
or a string (a login name). Then user-full-name returns the full
name corresponding to that user-id or login name. If you specify a
user-id or login name that isn’t defined, it returns nil.
The symbols user-login-name, user-real-login-name and
user-full-name are variables as well as functions. The functions
return the same values that the variables hold. These variables allow
you to “fake out” Emacs by telling the functions what to return. The
variables are also useful for constructing frame titles (see section Frame Titles).
This function returns the real UID of the user. The value may be floating point, in the (unlikely) event that the UID is too large to fit in a Lisp integer.
This function returns the effective UID of the user. The value may be floating point.
This function returns the effective GID of the Emacs process. The value may be floating point.
This function returns the real GID of the Emacs process. The value may be floating point.
This function returns a list of strings, listing the user names on the
system. If Emacs cannot retrieve this information, the return value
is a list containing just the value of user-real-login-name.
This function returns a list of strings, listing the names of user
groups on the system. If Emacs cannot retrieve this information, the
return value is nil.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section explains how to determine the current time and time zone.
Most of these functions represent time as a list of either four
integers, (sec-high sec-low microsec
picosec), or of three
integers, (sec-high sec-low microsec), or of
two integers, (sec-high sec-low). The integers
sec-high and sec-low give the high and low bits of an
integer number of seconds. This integer,
high * 2**16 + low,
is the number of seconds from the epoch (0:00 January 1, 1970
UTC) to the specified time. The third list element microsec, if
present, gives the number of microseconds from the start of that
second to the specified time.
Similarly, the fourth list element picosec, if present, gives
the number of picoseconds from the start of that microsecond to the
specified time.
The return value of current-time represents time using four
integers, as do the timestamps in the return value of
file-attributes (see Definition of file-attributes). In function arguments, e.g., the time-value
argument to current-time-string, two-, three-, and four-integer
lists are accepted. You can convert times from the list
representation into standard human-readable strings using
current-time-string, or to other forms using the
decode-time and format-time-string functions documented
in the following sections.
This function returns the current time and date as a human-readable
string. The format does not vary for the initial part of the string,
which contains the day of week, month, day of month, and time of day
in that order: the number of characters used for these fields is
always the same, so you can reliably
use substring to extract them. You should count
characters from the beginning of the string rather than from the end,
as the year might not have exactly four digits, and additional
information may some day be added at the end.
The argument time-value, if given, specifies a time to format (represented as a list of integers), instead of the current time.
(current-time-string)
⇒ "Wed Oct 14 22:21:05 1987"
This function returns the current time, represented as a list of four
integers (sec-high sec-low microsec picosec).
These integers have trailing zeros on systems that return time with
lower resolutions. On all current machines picosec is a
multiple of 1000, but this may change as higher-resolution clocks
become available.
This function returns the current time as a floating-point number of seconds since the epoch. The optional argument time-value, if given, specifies a time (represented as a list of integers) to convert instead of the current time.
Warning: Since the result is floating point, it may not be exact. Do not use this function if precise time stamps are required.
This function returns a list describing the time zone that the user is in.
The value has the form (offset name). Here
offset is an integer giving the number of seconds ahead of UTC
(east of Greenwich). A negative value means west of Greenwich. The
second element, name, is a string giving the name of the time
zone. Both elements change when daylight saving time begins or ends;
if the user has specified a time zone that does not use a seasonal time
adjustment, then the value is constant through time.
If the operating system doesn’t supply all the information necessary to
compute the value, the unknown elements of the list are nil.
The argument time-value, if given, specifies a time (represented as a list of integers) to analyze instead of the current time.
The current time zone is determined by the TZ environment
variable. See section Operating System Environment. For example, you can tell Emacs
to use universal time with (setenv "TZ" "UTC0"). If TZ
is not in the environment, Emacs uses a platform-dependent default
time zone.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These functions convert time values (lists of two to four integers, as explained in the previous section) into calendrical information and vice versa.
Many 32-bit operating systems are limited to time values containing 32 bits of information; these systems typically handle only the times from 1901-12-13 20:45:52 UTC through 2038-01-19 03:14:07 UTC. However, 64-bit and some 32-bit operating systems have larger time values, and can represent times far in the past or future.
Time conversion functions always use the Gregorian calendar, even for dates before the Gregorian calendar was introduced. Year numbers count the number of years since the year 1 B.C., and do not skip zero as traditional Gregorian years do; for example, the year number -37 represents the Gregorian year 38 B.C.
This function converts a time value into calendrical information. If you don’t specify time, it decodes the current time. The return value is a list of nine elements, as follows:
(seconds minutes hour day month year dow dst zone)
Here is what the elements mean:
The number of seconds past the minute, as an integer between 0 and 59. On some operating systems, this is 60 for leap seconds.
The number of minutes past the hour, as an integer between 0 and 59.
The hour of the day, as an integer between 0 and 23.
The day of the month, as an integer between 1 and 31.
The month of the year, as an integer between 1 and 12.
The year, an integer typically greater than 1900.
The day of week, as an integer between 0 and 6, where 0 stands for Sunday.
t if daylight saving time is effect, otherwise nil.
An integer indicating the time zone, as the number of seconds east of Greenwich.
Common Lisp Note: Common Lisp has different meanings for dow and zone.
This function is the inverse of decode-time. It converts seven
items of calendrical data into a time value. For the meanings of the
arguments, see the table above under decode-time.
Year numbers less than 100 are not treated specially. If you want them
to stand for years above 1900, or years above 2000, you must alter them
yourself before you call encode-time.
The optional argument zone defaults to the current time zone and
its daylight saving time rules. If specified, it can be either a list
(as you would get from current-time-zone), a string as in the
TZ environment variable, t for Universal Time, or an
integer (as you would get from decode-time). The specified
zone is used without any further alteration for daylight saving time.
If you pass more than seven arguments to encode-time, the first
six are used as seconds through year, the last argument is
used as zone, and the arguments in between are ignored. This
feature makes it possible to use the elements of a list returned by
decode-time as the arguments to encode-time, like this:
(apply 'encode-time (decode-time …))
You can perform simple date arithmetic by using out-of-range values for the seconds, minutes, hour, day, and month arguments; for example, day 0 means the day preceding the given month.
The operating system puts limits on the range of possible time values; if you try to encode a time that is out of range, an error results. For instance, years before 1970 do not work on some systems; on others, years as early as 1901 do work.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These functions convert time values to text in a string, and vice versa. Time values are lists of two to four integers (see section Time of Day).
This function parses the time-string string and returns the corresponding time value.
This function converts time (or the current time, if time is omitted) to a string according to format-string. The argument format-string may contain ‘%’-sequences which say to substitute parts of the time. Here is a table of what the ‘%’-sequences mean:
This stands for the abbreviated name of the day of week.
This stands for the full name of the day of week.
This stands for the abbreviated name of the month.
This stands for the full name of the month.
This is a synonym for ‘%x %X’.
This has a locale-specific meaning. In the default locale (named C), it is equivalent to ‘%A, %B %e, %Y’.
This stands for the day of month, zero-padded.
This is a synonym for ‘%m/%d/%y’.
This stands for the day of month, blank-padded.
This is a synonym for ‘%b’.
This stands for the hour (00–23).
This stands for the hour (01–12).
This stands for the day of the year (001–366).
This stands for the hour (0–23), blank padded.
This stands for the hour (1–12), blank padded.
This stands for the month (01–12).
This stands for the minute (00–59).
This stands for a newline.
This stands for the nanoseconds (000000000–999999999). To ask for fewer digits, use ‘%3N’ for milliseconds, ‘%6N’ for microseconds, etc. Any excess digits are discarded, without rounding.
This stands for ‘AM’ or ‘PM’, as appropriate.
This is a synonym for ‘%I:%M:%S %p’.
This is a synonym for ‘%H:%M’.
This stands for the seconds (00–59).
This stands for a tab character.
This is a synonym for ‘%H:%M:%S’.
This stands for the week of the year (01–52), assuming that weeks start on Sunday.
This stands for the numeric day of week (0–6). Sunday is day 0.
This stands for the week of the year (01–52), assuming that weeks start on Monday.
This has a locale-specific meaning. In the default locale (named ‘C’), it is equivalent to ‘%D’.
This has a locale-specific meaning. In the default locale (named ‘C’), it is equivalent to ‘%T’.
This stands for the year without century (00–99).
This stands for the year with century.
This stands for the time zone abbreviation (e.g., ‘EST’).
This stands for the time zone numerical offset (e.g., ‘-0500’).
You can also specify the field width and type of padding for any of
these ‘%’-sequences. This works as in printf: you write
the field width as digits in the middle of a ‘%’-sequences. If you
start the field width with ‘0’, it means to pad with zeros. If you
start the field width with ‘_’, it means to pad with spaces.
For example, ‘%S’ specifies the number of seconds since the minute; ‘%03S’ means to pad this with zeros to 3 positions, ‘%_3S’ to pad with spaces to 3 positions. Plain ‘%3S’ pads with zeros, because that is how ‘%S’ normally pads to two positions.
The characters ‘E’ and ‘O’ act as modifiers when used between
‘%’ and one of the letters in the table above. ‘E’ specifies
using the current locale’s “alternative” version of the date and time.
In a Japanese locale, for example, %Ex might yield a date format
based on the Japanese Emperors’ reigns. ‘E’ is allowed in
‘%Ec’, ‘%EC’, ‘%Ex’, ‘%EX’, ‘%Ey’, and
‘%EY’.
‘O’ means to use the current locale’s “alternative” representation of numbers, instead of the ordinary decimal digits. This is allowed with most letters, all the ones that output numbers.
If universal is non-nil, that means to describe the time as
Universal Time; nil means describe it using what Emacs believes
is the local time zone (see current-time-zone).
This function uses the C library function strftime
(see Formatting Calendar Time in The GNU C Library Reference
Manual) to do most of the work. In order to communicate with that
function, it first encodes its argument using the coding system
specified by locale-coding-system (see section Locales); after
strftime returns the resulting string,
format-time-string decodes the string using that same coding
system.
This function converts seconds, the number of seconds since the
epoch, to a time value and returns that. To convert back, use
float-time (see section Time of Day).
This function converts its argument seconds into a string of years, days, hours, etc., according to format-string. The argument format-string may contain ‘%’-sequences which control the conversion. Here is a table of what the ‘%’-sequences mean:
The integer number of 365-day years.
The integer number of days.
The integer number of hours.
The integer number of minutes.
The integer number of seconds.
Non-printing control flag. When it is used, other specifiers must be
given in the order of decreasing size, i.e., years before days, hours
before minutes, etc. Nothing will be produced in the result string to
the left of ‘%z’ until the first non-zero conversion is
encountered. For example, the default format used by
emacs-uptime (see section emacs-uptime)
"%Y, %D, %H, %M, %z%S" means that the number of seconds
will always be produced, but years, days, hours, and minutes will only
be shown if they are non-zero.
Produces a literal ‘%’.
Upper-case format sequences produce the units in addition to the numbers, lower-case formats produce only the numbers.
You can also specify the field width by following the ‘%’ with a
number; shorter numbers will be padded with blanks. An optional
period before the width requests zero-padding instead. For example,
"%.3Y" might produce "004 years".
Warning: This function works only with values of seconds
that don’t exceed most-positive-fixnum (see section most-positive-fixnum).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs provides several functions and primitives that return time, both elapsed and processor time, used by the Emacs process.
This function returns a string representing the Emacs
uptime—the elapsed wall-clock time this instance of Emacs is
running. The string is formatted by format-seconds according
to the optional argument format. For the available format
descriptors, see format-seconds. If format
is nil or omitted, it defaults to "%Y, %D, %H, %M,
%z%S".
When called interactively, it prints the uptime in the echo area.
This function returns the processor run time used by Emacs as a list
of four integers: (high low microsec
picosec), using the same format as current-time
(see section Time of Day).
Note that the time returned by this function excludes the time Emacs was not using the processor, and if the Emacs process has several threads, the returned value is the sum of the processor times used up by all Emacs threads.
If the system doesn’t provide a way to determine the processor run
time, get-internal-run-time returns the same time as
current-time.
This function returns the duration of the Emacs initialization (see section Summary: Sequence of Actions at Startup) in seconds, as a string. When called interactively, it prints the duration in the echo area.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These functions perform calendrical computations using time values
(the kind of list that current-time returns).
This returns t if time value t1 is less than time value
t2.
This returns the time difference t1 - t2 between two time values, in the same format as a time value.
This returns the sum of two time values, one of which ought to represent a time difference rather than a point in time. Here is how to add a number of seconds to a time value:
(time-add time (seconds-to-time seconds))
This function returns the number of days between the beginning of year 1 and time.
This returns the day number within the year corresponding to time.
This function returns t if year is a leap year.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can set up a timer to call a function at a specified future time or after a certain length of idleness.
Emacs cannot run timers at any arbitrary point in a Lisp program; it
can run them only when Emacs could accept output from a subprocess:
namely, while waiting or inside certain primitive functions such as
sit-for or read-event which can wait. Therefore, a
timer’s execution may be delayed if Emacs is busy. However, the time of
execution is very precise if Emacs is idle.
Emacs binds inhibit-quit to t before calling the timer
function, because quitting out of many timer functions can leave
things in an inconsistent state. This is normally unproblematical
because most timer functions don’t do a lot of work. Indeed, for a
timer to call a function that takes substantial time to run is likely
to be annoying. If a timer function needs to allow quitting, it
should use with-local-quit (see section Quitting). For example, if
a timer function calls accept-process-output to receive output
from an external process, that call should be wrapped inside
with-local-quit, to ensure that C-g works if the external
process hangs.
It is usually a bad idea for timer functions to alter buffer
contents. When they do, they usually should call undo-boundary
both before and after changing the buffer, to separate the timer’s
changes from user commands’ changes and prevent a single undo entry
from growing to be quite large.
Timer functions should also avoid calling functions that cause Emacs
to wait, such as sit-for (see section Waiting for Elapsed Time or Input). This can lead to
unpredictable effects, since other timers (or even the same timer) can
run while waiting. If a timer function needs to perform an action
after a certain time has elapsed, it can do this by scheduling a new
timer.
If a timer function calls functions that can change the match data, it should save and restore the match data. See section Saving and Restoring the Match Data.
This sets up a timer that calls the function function with
arguments args at time time. If repeat is a number
(integer or floating point), the timer is scheduled to run again every
repeat seconds after time. If repeat is nil,
the timer runs only once.
time may specify an absolute or a relative time.
Absolute times may be specified using a string with a limited variety of formats, and are taken to be times today, even if already in the past. The recognized forms are ‘xxxx’, ‘x:xx’, or ‘xx:xx’ (military time), and ‘xxam’, ‘xxAM’, ‘xxpm’, ‘xxPM’, ‘xx:xxam’, ‘xx:xxAM’, ‘xx:xxpm’, or ‘xx:xxPM’. A period can be used instead of a colon to separate the hour and minute parts.
To specify a relative time as a string, use numbers followed by units. For example:
denotes 1 minute from now.
denotes 65 seconds from now.
denotes exactly 103 months, 123 days, and 10862 seconds from now.
For relative time values, Emacs considers a month to be exactly thirty days, and a year to be exactly 365.25 days.
Not all convenient formats are strings. If time is a number
(integer or floating point), that specifies a relative time measured in
seconds. The result of encode-time can also be used to specify
an absolute value for time.
In most cases, repeat has no effect on when first call
takes place—time alone specifies that. There is one exception:
if time is t, then the timer runs whenever the time is a
multiple of repeat seconds after the epoch. This is useful for
functions like display-time.
The function run-at-time returns a timer value that identifies
the particular scheduled future action. You can use this value to call
cancel-timer (see below).
A repeating timer nominally ought to run every repeat seconds, but remember that any invocation of a timer can be late. Lateness of one repetition has no effect on the scheduled time of the next repetition. For instance, if Emacs is busy computing for long enough to cover three scheduled repetitions of the timer, and then starts to wait, it will immediately call the timer function three times in immediate succession (presuming no other timers trigger before or between them). If you want a timer to run again no less than n seconds after the last invocation, don’t use the repeat argument. Instead, the timer function should explicitly reschedule the timer.
This variable’s value specifies the maximum number of times to repeat calling a timer function in a row, when many previously scheduled calls were unavoidably delayed.
Execute body, but give up after seconds seconds. If
body finishes before the time is up, with-timeout returns
the value of the last form in body. If, however, the execution of
body is cut short by the timeout, then with-timeout
executes all the timeout-forms and returns the value of the last
of them.
This macro works by setting a timer to run after seconds seconds. If body finishes before that time, it cancels the timer. If the timer actually runs, it terminates execution of body, then executes timeout-forms.
Since timers can run within a Lisp program only when the program calls a
primitive that can wait, with-timeout cannot stop executing
body while it is in the midst of a computation—only when it
calls one of those primitives. So use with-timeout only with a
body that waits for input, not one that does a long computation.
The function y-or-n-p-with-timeout provides a simple way to use
a timer to avoid waiting too long for an answer. See section Yes-or-No Queries.
This cancels the requested action for timer, which should be a
timer—usually, one previously returned by run-at-time or
run-with-idle-timer. This cancels the effect of that call to
one of these functions; the arrival of the specified time will not
cause anything special to happen.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here is how to set up a timer that runs when Emacs is idle for a certain length of time. Aside from how to set them up, idle timers work just like ordinary timers.
Set up a timer which runs the next time Emacs is idle for secs
seconds. The value of secs may be a number or a value of the type
returned by current-idle-time.
If repeat is nil, the timer runs just once, the first time
Emacs remains idle for a long enough time. More often repeat is
non-nil, which means to run the timer each time Emacs
remains idle for secs seconds.
The function run-with-idle-timer returns a timer value which you
can use in calling cancel-timer (see section Timers for Delayed Execution).
Emacs becomes idle when it starts waiting for user input, and
it remains idle until the user provides some input. If a timer is set
for five seconds of idleness, it runs approximately five seconds after
Emacs first becomes idle. Even if repeat is non-nil,
this timer will not run again as long as Emacs remains idle, because
the duration of idleness will continue to increase and will not go
down to five seconds again.
Emacs can do various things while idle: garbage collect, autosave or handle data from a subprocess. But these interludes during idleness do not interfere with idle timers, because they do not reset the clock of idleness to zero. An idle timer set for 600 seconds will run when ten minutes have elapsed since the last user command was finished, even if subprocess output has been accepted thousands of times within those ten minutes, and even if there have been garbage collections and autosaves.
When the user supplies input, Emacs becomes non-idle while executing the input. Then it becomes idle again, and all the idle timers that are set up to repeat will subsequently run another time, one by one.
Do not write an idle timer function containing a loop which does a
certain amount of processing each time around, and exits when
(input-pending-p) is non-nil. This approach seems very
natural but has two problems:
Similarly, do not write an idle timer function that sets up another idle timer (including the same idle timer) with secs argument less than or equal to the current idleness time. Such a timer will run almost immediately, and continue running again and again, instead of waiting for the next time Emacs becomes idle. The correct approach is to reschedule with an appropriate increment of the current value of the idleness time, as described below.
If Emacs is idle, this function returns the length of time Emacs has
been idle, as a list of four integers: (sec-high
sec-low microsec picosec), using the same format as
current-time (see section Time of Day).
When Emacs is not idle, current-idle-time returns nil.
This is a convenient way to test whether Emacs is idle.
The main use of current-idle-time is when an idle timer
function wants to “take a break” for a while. It can set up another
idle timer to call the same function again, after a few seconds more
idleness. Here’s an example:
(defvar my-resume-timer nil "Timer for `my-timer-function' to reschedule itself, or nil.") (defun my-timer-function () ;; If the user types a command whilemy-resume-timer;; is active, the next time this function is called from ;; its main idle timer, deactivatemy-resume-timer. (when my-resume-timer (cancel-timer my-resume-timer)) ...do the work for a while... (when taking-a-break (setq my-resume-timer (run-with-idle-timer ;; Compute an idle time break-length ;; more than the current value. (time-add (current-idle-time) (seconds-to-time break-length)) nil 'my-timer-function))))
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes functions and variables for recording or manipulating terminal input. See Emacs Display, for related functions.
| 38.12.1 Input Modes | Options for how input is processed. | |
| 38.12.2 Recording Input | Saving histories of recent or all input events. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This function sets the mode for reading keyboard input. If
interrupt is non-nil, then Emacs uses input interrupts.
If it is nil, then it uses CBREAK mode. The default
setting is system-dependent. Some systems always use CBREAK mode
regardless of what is specified.
When Emacs communicates directly with X, it ignores this argument and uses interrupts if that is the way it knows how to communicate.
If flow is non-nil, then Emacs uses XON/XOFF
(C-q, C-s) flow control for output to the terminal. This
has no effect except in CBREAK mode.
The argument meta controls support for input character codes
above 127. If meta is t, Emacs converts characters with
the 8th bit set into Meta characters. If meta is nil,
Emacs disregards the 8th bit; this is necessary when the terminal uses
it as a parity bit. If meta is neither t nor nil,
Emacs uses all 8 bits of input unchanged. This is good for terminals
that use 8-bit character sets.
If quit-char is non-nil, it specifies the character to
use for quitting. Normally this character is C-g.
See section Quitting.
The current-input-mode function returns the input mode settings
Emacs is currently using.
This function returns the current mode for reading keyboard input. It
returns a list, corresponding to the arguments of set-input-mode,
of the form (interrupt flow meta quit) in
which:
is non-nil when Emacs is using interrupt-driven input. If
nil, Emacs is using CBREAK mode.
is non-nil if Emacs uses XON/XOFF (C-q, C-s)
flow control for output to the terminal. This value is meaningful only
when interrupt is nil.
is t if Emacs treats the eighth bit of input characters as
the meta bit; nil means Emacs clears the eighth bit of every
input character; any other value means Emacs uses all eight bits as the
basic character code.
is the character Emacs currently uses for quitting, usually C-g.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This function returns a vector containing the last 300 input events from the keyboard or mouse. All input events are included, whether or not they were used as parts of key sequences. Thus, you always get the last 300 input events, not counting events generated by keyboard macros. (These are excluded because they are less interesting for debugging; it should be enough to see the events that invoked the macros.)
A call to clear-this-command-keys (see section Information from the Command Loop)
causes this function to return an empty vector immediately afterward.
This function opens a dribble file named filename. When a dribble file is open, each input event from the keyboard or mouse (but not those from keyboard macros) is written in that file. A non-character event is expressed using its printed representation surrounded by ‘<…>’. Be aware that sensitive information (such as passwords) may end up recorded in the dribble file.
You close the dribble file by calling this function with an argument
of nil.
See also the open-termscript function (see section Terminal Output).
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The terminal output functions send output to a text terminal, or keep
track of output sent to the terminal. The variable baud-rate
tells you what Emacs thinks is the output speed of the terminal.
This variable’s value is the output speed of the terminal, as far as Emacs knows. Setting this variable does not change the speed of actual data transmission, but the value is used for calculations such as padding.
It also affects decisions about whether to scroll part of the screen or repaint on text terminals. See section Forcing Redisplay, for the corresponding functionality on graphical terminals.
The value is measured in baud.
If you are running across a network, and different parts of the
network work at different baud rates, the value returned by Emacs may be
different from the value used by your local terminal. Some network
protocols communicate the local terminal speed to the remote machine, so
that Emacs and other programs can get the proper value, but others do
not. If Emacs has the wrong value, it makes decisions that are less
than optimal. To fix the problem, set baud-rate.
This function sends string to terminal without alteration.
Control characters in string have terminal-dependent effects.
This function operates only on text terminals. terminal may be
a terminal object, a frame, or nil for the selected frame’s
terminal. In batch mode, string is sent to stdout when
terminal is nil.
One use of this function is to define function keys on terminals that have downloadable function key definitions. For example, this is how (on certain terminals) to define function key 4 to move forward four characters (by transmitting the characters C-u C-f to the computer):
(send-string-to-terminal "\eF4\^U\^F")
⇒ nil
This function is used to open a termscript file that will record
all the characters sent by Emacs to the terminal. It returns
nil. Termscript files are useful for investigating problems
where Emacs garbles the screen, problems that are due to incorrect
Termcap entries or to undesirable settings of terminal options more
often than to actual Emacs bugs. Once you are certain which characters
were actually output, you can determine reliably whether they correspond
to the Termcap specifications in use.
(open-termscript "../junk/termscript")
⇒ nil
You close the termscript file by calling this function with an
argument of nil.
See also open-dribble-file in Recording Input.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To play sound using Emacs, use the function play-sound. Only
certain systems are supported; if you call play-sound on a
system which cannot really do the job, it gives an error.
The sound must be stored as a file in RIFF-WAVE format (‘.wav’) or Sun Audio format (‘.au’).
This function plays a specified sound. The argument, sound, has
the form (sound properties...), where the properties
consist of alternating keywords (particular symbols recognized
specially) and values corresponding to them.
Here is a table of the keywords that are currently meaningful in sound, and their meanings:
:file fileThis specifies the file containing the sound to play.
If the file name is not absolute, it is expanded against
the directory data-directory.
:data dataThis specifies the sound to play without need to refer to a file. The value, data, should be a string containing the same bytes as a sound file. We recommend using a unibyte string.
:volume volumeThis specifies how loud to play the sound. It should be a number in the range of 0 to 1. The default is to use whatever volume has been specified before.
:device deviceThis specifies the system device on which to play the sound, as a string. The default device is system-dependent.
Before actually playing the sound, play-sound
calls the functions in the list play-sound-functions.
Each function is called with one argument, sound.
This function is an alternative interface to playing a sound file specifying an optional volume and device.
A list of functions to be called before playing a sound. Each function is called with one argument, a property list that describes the sound.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To define system-specific X11 keysyms, set the variable
system-key-alist.
This variable’s value should be an alist with one element for each
system-specific keysym. Each element has the form (code
. symbol), where code is the numeric keysym code (not
including the “vendor specific” bit,
-2**28),
and symbol is the name for the function key.
For example (168 . mute-acute) defines a system-specific key (used
by HP X servers) whose numeric code is
-2**28
+ 168.
It is not crucial to exclude from the alist the keysyms of other X servers; those do no harm, as long as they don’t conflict with the ones used by the X server actually in use.
The variable is always local to the current terminal, and cannot be buffer-local. See section Multiple Terminals.
You can specify which keysyms Emacs should use for the Meta, Alt, Hyper, and Super modifiers by setting these variables:
The name of the keysym that should stand for the Alt modifier (respectively, for Meta, Hyper, and Super). For example, here is how to swap the Meta and Alt modifiers within Emacs:
(setq x-alt-keysym 'meta) (setq x-meta-keysym 'alt)
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The command-line option ‘-batch’ causes Emacs to run noninteractively. In this mode, Emacs does not read commands from the terminal, it does not alter the terminal modes, and it does not expect to be outputting to an erasable screen. The idea is that you specify Lisp programs to run; when they are finished, Emacs should exit. The way to specify the programs to run is with ‘-l file’, which loads the library named file, or ‘-f function’, which calls function with no arguments, or ‘--eval form’.
Any Lisp program output that would normally go to the echo area,
either using message, or using prin1, etc., with t
as the stream, goes instead to Emacs’s standard error descriptor when
in batch mode. Similarly, input that would normally come from the
minibuffer is read from the standard input descriptor.
Thus, Emacs behaves much like a noninteractive
application program. (The echo area output that Emacs itself normally
generates, such as command echoing, is suppressed entirely.)
This variable is non-nil when Emacs is running in batch mode.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs supports the X Session Management Protocol, which is used to suspend and restart applications. In the X Window System, a program called the session manager is responsible for keeping track of the applications that are running. When the X server shuts down, the session manager asks applications to save their state, and delays the actual shutdown until they respond. An application can also cancel the shutdown.
When the session manager restarts a suspended session, it directs these applications to individually reload their saved state. It does this by specifying a special command-line argument that says what saved session to restore. For Emacs, this argument is ‘--smid session’.
Emacs supports saving state via a hook called
emacs-save-session-functions. Emacs runs this hook when the
session manager tells it that the window system is shutting down. The
functions are called with no arguments, and with the current buffer
set to a temporary buffer. Each function can use insert to add
Lisp code to this buffer. At the end, Emacs saves the buffer in a
file, called the session file.
Subsequently, when the session manager restarts Emacs, it loads the
session file automatically (see section Loading). This is performed by a
function named emacs-session-restore, which is called during
startup. See section Summary: Sequence of Actions at Startup.
If a function in emacs-save-session-functions returns
non-nil, Emacs tells the session manager to cancel the
shutdown.
Here is an example that just inserts some text into *scratch* when Emacs is restarted by the session manager.
(add-hook 'emacs-save-session-functions 'save-yourself-test)
(defun save-yourself-test () (insert "(save-current-buffer (switch-to-buffer \"*scratch*\") (insert \"I am restored\"))") nil)
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs is able to send notifications on systems that support the
freedesktop.org Desktop Notifications Specification. In order to use
this functionality, Emacs must have been compiled with D-Bus support,
and the notifications library must be loaded. See D-Bus in D-Bus integration in Emacs.
This function sends a notification to the desktop via D-Bus, consisting of the parameters specified by the params arguments. These arguments should consist of alternating keyword and value pairs. The supported keywords and values are as follows:
:bus busThe D-Bus bus. This argument is needed only if a bus other than
:session shall be used.
:title titleThe notification title.
:body textThe notification body text. Depending on the implementation of the notification server, the text could contain HTML markups, like ‘"<b>bold text</b>"’, hyperlinks, or images. Special HTML characters must be encoded, as ‘"Contact <postmaster@localhost>!"’.
:app-name nameThe name of the application sending the notification. The default is
notifications-application-name.
:replaces-id idThe notification id that this notification replaces. id
must be the result of a previous notifications-notify call.
:app-icon icon-fileThe file name of the notification icon. If set to nil, no icon
is displayed. The default is notifications-application-icon.
:actions (key title key title ...)A list of actions to be applied. key and title are both strings. The default action (usually invoked by clicking the notification) should have a key named ‘"default"’. The title can be anything, though implementations are free not to display it.
:timeout timeoutThe timeout time in milliseconds since the display of the notification at which the notification should automatically close. If -1, the notification’s expiration time is dependent on the notification server’s settings, and may vary for the type of notification. If 0, the notification never expires. Default value is -1.
:urgency urgencyThe urgency level. It can be low, normal, or critical.
:action-itemsWhen this keyword is given, the title string of the actions is interpreted as icon name.
:category categoryThe type of notification this is, a string. See the Desktop Notifications Specification for a list of standard categories.
:desktop-entry filenameThis specifies the name of the desktop filename representing the calling program, like ‘"emacs"’.
:image-data (width height rowstride has-alpha bits channels data)This is a raw data image format that describes the width, height, rowstride, whether there is an alpha channel, bits per sample, channels and image data, respectively.
:image-path pathThis is represented either as a URI (‘file://’ is the only URI schema supported right now) or a name in a freedesktop.org-compliant icon theme from ‘$XDG_DATA_DIRS/icons’.
:sound-file filenameThe path to a sound file to play when the notification pops up.
:sound-name nameA themable named sound from the freedesktop.org sound naming specification from ‘$XDG_DATA_DIRS/sounds’, to play when the notification pops up. Similar to the icon name, only for sounds. An example would be ‘"message-new-instant"’.
:suppress-soundCauses the server to suppress playing any sounds, if it has that ability.
:residentWhen set the server will not automatically remove the notification
when an action has been invoked. The notification will remain resident
in the server until it is explicitly removed by the user or by the
sender. This hint is likely only useful when the server has the
:persistence capability.
:transientWhen set the server will treat the notification as transient and by-pass the server’s persistence capability, if it should exist.
:x position:y positionSpecifies the X, Y location on the screen that the notification should point to. Both arguments must be used together.
:on-action functionFunction to call when an action is invoked. The notification id and the key of the action are passed as arguments to the function.
:on-close functionFunction to call when the notification has been closed by timeout or by the user. The function receive the notification id and the closing reason as arguments:
expired if the notification has expired
dismissed if the notification was dismissed by the user
close-notification if the notification was closed by a call to
notifications-close-notification
undefined if the notification server hasn’t provided a reason
Which parameters are accepted by the notification server can be
checked via notifications-get-capabilities.
This function returns a notification id, an integer, which can be used
to manipulate the notification item with
notifications-close-notification or the :replaces-id
argument of another notifications-notify call. For example:
(defun my-on-action-function (id key)
(message "Message %d, key \"%s\" pressed" id key))
⇒ my-on-action-function
(defun my-on-close-function (id reason)
(message "Message %d, closed due to \"%s\"" id reason))
⇒ my-on-close-function
(notifications-notify
:title "Title"
:body "This is <b>important</b>."
:actions '("Confirm" "I agree" "Refuse" "I disagree")
:on-action 'my-on-action-function
:on-close 'my-on-close-function)
⇒ 22
A message window opens on the desktop. Press "I agree"
⇒ Message 22, key "Confirm" pressed
Message 22, closed due to "dismissed"
This function closes a notification with identifier id.
bus can be a string denoting a D-Bus connection, the default is
:session.
Returns the capabilities of the notification server, a list of
symbols. bus can be a string denoting a D-Bus connection, the
default is :session. The following capabilities can be
expected:
:actionsThe server will provide the specified actions to the user.
:bodySupports body text.
:body-hyperlinksThe server supports hyperlinks in the notifications.
:body-imagesThe server supports images in the notifications.
:body-markupSupports markup in the body text.
:icon-multiThe server will render an animation of all the frames in a given image array.
:icon-staticSupports display of exactly 1 frame of any given image array. This
value is mutually exclusive with :icon-multi.
:persistenceThe server supports persistence of notifications.
:soundThe server supports sounds on notifications.
Further vendor-specific caps start with :x-vendor, like
:x-gnome-foo-cap.
Return information on the notification server, a list of strings.
bus can be a string denoting a D-Bus connection, the default is
:session. The returned list is (name vendor
version spec-version).
The product name of the server.
The vendor name. For example, ‘"KDE"’, ‘"GNOME"’.
The server’s version number.
The specification version the server is compliant with.
If spec_version is nil, the server supports a
specification prior to ‘"1.0"’.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Several operating systems support watching of filesystems for changes of files. If configured properly, Emacs links a respective library like gfilenotify, inotify, or w32notify statically. These libraries enable watching of filesystems on the local machine.
It is also possible to watch filesystems on remote machines, see Remote Files in The GNU Emacs Manual This does not depend on one of the libraries linked to Emacs.
Since all these libraries emit different events on notified file
changes, there is the Emacs library filenotify which provides a
unique interface.
Add a watch for filesystem events pertaining to file. This arranges for filesystem events pertaining to file to be reported to Emacs.
The returned value is a descriptor for the added watch. Its type
depends on the underlying library, it cannot be assumed to be an
integer as in the example below. It should be used for comparison by
equal only.
If the file cannot be watched for some reason, this function
signals a file-notify-error error.
Sometimes, mounted filesystems cannot be watched for file changes.
This is not detected by this function, a non-nil return value
does not guarantee that changes on file will be notified.
flags is a list of conditions to set what will be watched for. It can include the following symbols:
changewatch for file changes
attribute-changewatch for file attribute changes, like permissions or modification time
If file is a directory, changes for all files in that directory will be notified. This does not work recursively.
When any event happens, Emacs will call the callback function passing it a single argument event, which is of the form
(descriptor action file [file1])
descriptor is the same object as the one returned by this function. action is the description of the event. It could be any one of the following symbols:
createdfile was created
deletedfile was deleted
changedfile has changed
renamedfile has been renamed to file1
attribute-changeda file attribute was changed
file and file1 are the name of the file(s) whose event is being reported. For example:
(require 'filenotify)
⇒ filenotify
(defun my-notify-callback (event)
(message "Event %S" event))
⇒ my-notify-callback
(file-notify-add-watch
"/tmp" '(change attribute-change) 'my-notify-callback)
⇒ 35025468
(write-region "foo" nil "/tmp/foo")
⇒ Event (35025468 created "/tmp/.#foo")
Event (35025468 created "/tmp/foo")
Event (35025468 changed "/tmp/foo")
Event (35025468 deleted "/tmp/.#foo")
(write-region "bla" nil "/tmp/foo")
⇒ Event (35025468 created "/tmp/.#foo")
Event (35025468 changed "/tmp/foo") [2 times]
Event (35025468 deleted "/tmp/.#foo")
(set-file-modes "/tmp/foo" (default-file-modes))
⇒ Event (35025468 attribute-changed "/tmp/foo")
Whether the action renamed is returned, depends on the used
watch library. It can be expected, when a directory is watched, and
both file and file1 belong to this directory. Otherwise,
the actions deleted and created could be returned in a
random order.
(rename-file "/tmp/foo" "/tmp/bla")
⇒ Event (35025468 renamed "/tmp/foo" "/tmp/bla")
(file-notify-add-watch
"/var/tmp" '(change attribute-change) 'my-notify-callback)
⇒ 35025504
(rename-file "/tmp/bla" "/var/tmp/bla")
⇒ ;; gfilenotify
Event (35025468 renamed "/tmp/bla" "/var/tmp/bla")
⇒ ;; inotify
Event (35025504 created "/var/tmp/bla")
Event (35025468 deleted "/tmp/bla")
Removes an existing file watch specified by its descriptor.
descriptor should be an object returned by
file-notify-add-watch.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A dynamically loaded library is a library that is loaded on demand, when its facilities are first needed. Emacs supports such on-demand loading of support libraries for some of its features.
This is an alist of dynamic libraries and external library files implementing them.
Each element is a list of the form
(library files…), where the car is
a symbol representing a supported external library, and the rest are
strings giving alternate filenames for that library.
Emacs tries to load the library from the files in the order they appear in the list; if none is found, the Emacs session won’t have access to that library, and the features it provides will be unavailable.
Image support on some platforms uses this facility. Here’s an example of setting this variable for supporting images on MS-Windows:
(setq dynamic-library-alist
'((xpm "libxpm.dll" "xpm4.dll" "libXpm-nox4.dll")
(png "libpng12d.dll" "libpng12.dll" "libpng.dll"
"libpng13d.dll" "libpng13.dll")
(jpeg "jpeg62.dll" "libjpeg.dll" "jpeg-62.dll"
"jpeg.dll")
(tiff "libtiff3.dll" "libtiff.dll")
(gif "giflib4.dll" "libungif4.dll" "libungif.dll")
(svg "librsvg-2-2.dll")
(gdk-pixbuf "libgdk_pixbuf-2.0-0.dll")
(glib "libglib-2.0-0.dll")
(gobject "libgobject-2.0-0.dll")))
Note that image types pbm and xbm do not need entries in
this variable because they do not depend on external libraries and are
always available in Emacs.
Also note that this variable is not meant to be a generic facility for accessing external libraries; only those already known by Emacs can be loaded through it.
This variable is ignored if the given library is statically linked into Emacs.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs provides a standard way to distribute Emacs Lisp code to users. A package is a collection of one or more files, formatted and bundled in such a way that users can easily download, install, uninstall, and upgrade it.
The following sections describe how to create a package, and how to put it in a package archive for others to download. See Packages in The GNU Emacs Manual, for a description of user-level features of the packaging system.
| 39.1 Packaging Basics | The basic concepts of Emacs Lisp packages. | |
| 39.2 Simple Packages | How to package a single .el file. | |
| 39.3 Multi-file Packages | How to package multiple files. | |
| 39.4 Creating and Maintaining Package Archives | Maintaining package archives. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A package is either a simple package or a multi-file package. A simple package is stored in a package archive as a single Emacs Lisp file, while a multi-file package is stored as a tar file (containing multiple Lisp files, and possibly non-Lisp files such as a manual).
In ordinary usage, the difference between simple packages and multi-file packages is relatively unimportant; the Package Menu interface makes no distinction between them. However, the procedure for creating them differs, as explained in the following sections.
Each package (whether simple or multi-file) has certain attributes:
A short word (e.g., ‘auctex’). This is usually also the symbol prefix used in the program (see section Emacs Lisp Coding Conventions).
A version number, in a form that the function version-to-list
understands (e.g., ‘11.86’). Each release of a package should be
accompanied by an increase in the version number.
This is shown when the package is listed in the Package Menu. It should occupy a single line, ideally in 36 characters or less.
This is shown in the buffer created by C-h P
(describe-package), following the package’s brief description
and installation status. It normally spans multiple lines, and should
fully describe the package’s capabilities and how to begin using it
once it is installed.
A list of other packages (possibly including minimal acceptable version numbers) on which this package depends. The list may be empty, meaning this package has no dependencies. Otherwise, installing this package also automatically installs its dependencies; if any dependency cannot be found, the package cannot be installed.
Installing a package, either via the command package-install-file,
or via the Package Menu, creates a subdirectory of
package-user-dir named name-version, where
name is the package’s name and version its version
(e.g., ~/.emacs.d/elpa/auctex-11.86/). We call this the
package’s content directory. It is where Emacs puts the
package’s contents (the single Lisp file for a simple package, or the
files extracted from a multi-file package).
Emacs then searches every Lisp file in the content directory for
autoload magic comments (see section Autoload). These autoload
definitions are saved to a file named name-autoloads.el
in the content directory. They are typically used to autoload the
principal user commands defined in the package, but they can also
perform other tasks, such as adding an element to
auto-mode-alist (see section How Emacs Chooses a Major Mode). Note that a package
typically does not autoload every function and variable defined
within it—only the handful of commands typically called to begin
using the package. Emacs then byte-compiles every Lisp file in the
package.
After installation, the installed package is loaded: Emacs
adds the package’s content directory to load-path, and
evaluates the autoload definitions in name-autoloads.el.
Whenever Emacs starts up, it automatically calls the function
package-initialize to load installed packages. This is done
after loading the init file and abbrev file (if any) and before
running after-init-hook (see section Summary: Sequence of Actions at Startup). Automatic
package loading is disabled if the user option
package-enable-at-startup is nil.
This function initializes Emacs’ internal record of which packages are
installed, and loads them. The user option package-load-list
specifies which packages to load; by default, all installed packages
are loaded. See Package Installation in The GNU Emacs
Manual.
The optional argument no-activate, if non-nil, causes
Emacs to update its record of installed packages without actually
loading them; it is for internal use only.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A simple package consists of a single Emacs Lisp source file. The file must conform to the Emacs Lisp library header conventions (see section Conventional Headers for Emacs Libraries). The package’s attributes are taken from the various headers, as illustrated by the following example:
;;; superfrobnicator.el --- Frobnicate and bifurcate flanges ;; Copyright (C) 2011 Free Software Foundation, Inc.
;; Author: J. R. Hacker <jrh@example.com> ;; Version: 1.3 ;; Package-Requires: ((flange "1.0")) ;; Keywords: multimedia, frobnicate ;; URL: http://example.com/jrhacker/superfrobnicate … ;;; Commentary: ;; This package provides a minor mode to frobnicate and/or ;; bifurcate any flanges you desire. To activate it, just type … ;;;###autoload (define-minor-mode superfrobnicator-mode …
The name of the package is the same as the base name of the file, as written on the first line. Here, it is ‘superfrobnicator’.
The brief description is also taken from the first line. Here, it is ‘Frobnicate and bifurcate flanges’.
The version number comes from the ‘Package-Version’ header, if it exists, or from the ‘Version’ header otherwise. One or the other must be present. Here, the version number is 1.3.
If the file has a ‘;;; Commentary:’ section, this section is used as the long description. (When displaying the description, Emacs omits the ‘;;; Commentary:’ line, as well as the leading comment characters in the commentary itself.)
If the file has a ‘Package-Requires’ header, that is used as the package dependencies. In the above example, the package depends on the ‘flange’ package, version 1.0 or higher. See section Conventional Headers for Emacs Libraries, for a description of the ‘Package-Requires’ header. If the header is omitted, the package has no dependencies.
The ‘Keywords’ and ‘URL’ headers are optional, but recommended.
The command describe-package uses these to add links to its
output. The ‘Keywords’ header should contain at least one
standard keyword from the finder-known-keywords list.
The file ought to also contain one or more autoload magic comments,
as explained in Packaging Basics. In the above example, a magic
comment autoloads superfrobnicator-mode.
See section Creating and Maintaining Package Archives, for a explanation of how to add a single-file package to a package archive.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A multi-file package is less convenient to create than a single-file package, but it offers more features: it can include multiple Emacs Lisp files, an Info manual, and other file types (such as images).
Prior to installation, a multi-file package is stored in a package archive as a tar file. The tar file must be named name-version.tar, where name is the package name and version is the version number. Its contents, once extracted, must all appear in a directory named name-version, the content directory (see section Packaging Basics). Files may also extract into subdirectories of the content directory.
One of the files in the content directory must be named
name-pkg.el. It must contain a single Lisp form,
consisting of a call to the function define-package, described
below. This defines the package’s version, brief description, and
requirements.
For example, if we distribute version 1.3 of the superfrobnicator as a multi-file package, the tar file would be superfrobnicator-1.3.tar. Its contents would extract into the directory superfrobnicator-1.3, and one of these would be the file superfrobnicator-pkg.el.
This function defines a package. name is the package name, a
string. version is the version, as a string of a form that can
be understood by the function version-to-list. docstring
is the brief description.
requirements is a list of required packages and their versions.
Each element in this list should have the form (dep-name
dep-version), where dep-name is a symbol whose name is
the dependency’s package name, and dep-version is the
dependency’s version (a string).
If the content directory contains a file named README, this file is used as the long description.
If the content directory contains a file named dir, this is
assumed to be an Info directory file made with install-info.
See Invoking
install-info in Texinfo. The relevant Info files should also
be present in the content directory. In this case, Emacs will
automatically add the content directory to Info-directory-list
when the package is activated.
Do not include any .elc files in the package. Those are created when the package is installed. Note that there is no way to control the order in which files are byte-compiled.
Do not include any file named name-autoloads.el. This file is reserved for the package’s autoload definitions (see section Packaging Basics). It is created automatically when the package is installed, by searching all the Lisp files in the package for autoload magic comments.
If the multi-file package contains auxiliary data files (such as
images), the package’s Lisp code can refer to these files via the
variable load-file-name (see section Loading). Here is an example:
(defconst superfrobnicator-base (file-name-directory load-file-name)) (defun superfrobnicator-fetch-image (file) (expand-file-name file superfrobnicator-base))
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Via the Package Menu, users may download packages from package
archives. Such archives are specified by the variable
package-archives, whose default value contains a single entry:
the archive hosted by the GNU project at http://elpa.gnu.org. This
section describes how to set up and maintain a package archive.
The value of this variable is an alist of package archives recognized by the Emacs package manager.
Each alist element corresponds to one archive, and should have the
form (id . location), where id is the name of
the archive (a string) and location is its base location
(a string).
If the base location starts with ‘http:’, it is treated as a HTTP URL, and packages are downloaded from this archive via HTTP (as is the case for the default GNU archive).
Otherwise, the base location should be a directory name. In this case, Emacs retrieves packages from this archive via ordinary file access. Such “local” archives are mainly useful for testing.
A package archive is simply a directory in which the package files, and associated files, are stored. If you want the archive to be reachable via HTTP, this directory must be accessible to a web server. How to accomplish this is beyond the scope of this manual.
A convenient way to set up and update a package archive is via the
package-x library. This is included with Emacs, but not loaded
by default; type M-x load-library RET package-x RET to
load it, or add (require 'package-x) to your init file.
See Lisp Libraries in The GNU Emacs Manual.
Once loaded, you can make use of the following:
The value of this variable is the base location of a package archive,
as a directory name. The commands in the package-x library
will use this base location.
The directory name should be absolute. You may specify a remote name, such as /ssh:foo@example.com:/var/www/packages/, if the package archive is on a different machine. See Remote Files in The GNU Emacs Manual.
This command prompts for filename, a file name, and uploads that
file to package-archive-upload-base. The file must be either a
simple package (a .el file) or a multi-file package (a
.tar file); otherwise, an error is raised. The package
attributes are automatically extracted, and the archive’s contents
list is updated with this information.
If package-archive-upload-base does not specify a valid
directory, the function prompts interactively for one. If the
directory does not exist, it is created. The directory need not have
any initial contents (i.e., you can use this command to populate an
initially empty archive).
This command is similar to package-upload-file, but instead of
prompting for a package file, it uploads the contents of the current
buffer. The current buffer must be visiting a simple package (a
.el file) or a multi-file package (a .tar file);
otherwise, an error is raised.
After you create an archive, remember that it is not accessible in the
Package Menu interface unless it is in package-archives.
Maintaining a public package archive entails a degree of responsibility. When Emacs users install packages from your archive, those packages can cause Emacs to run arbitrary code with the permissions of the installing user. (This is true for Emacs code in general, not just for packages.) So you should ensure that your archive is well-maintained and keep the hosting system secure.
One way to increase the security of your packages is to sign them using a cryptographic key. If you have generated a private/public gpg key pair, you can use gpg to sign the package like this:
gpg -ba -o file.sig file
For a single-file package, file is the package Lisp file; for a multi-file package, it is the package tar file. You can also sign the archive’s contents file in the same way. Make the .sig files available in the same location as the packages. You should also make your public key available for people to download; e.g., by uploading it to a key server such as http://pgp.mit.edu/. When people install packages from your archive, they can use your public key to verify the signatures.
A full explanation of these matters is outside the scope of this manual. For more information on cryptographic keys and signing, see GnuPG in The GNU Privacy Guard Manual. Emacs comes with an interface to GNU Privacy Guard, see EasyPG in Emacs EasyPG Assistant Manual.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
For those users who live backwards in time, here is information about downgrading to Emacs version 23.4. We hope you will enjoy the greater simplicity that results from the absence of many Emacs 24.5 features.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
lexical-binding variable has been
removed, and so has the lexical argument to eval. The
defvar and defconst forms no longer mark variables as
dynamic, since all variables are dynamic.
Having only dynamic binding follows the spirit of Emacs extensibility, for it allows any Emacs code to access any defined variable with a minimum of fuss. But See section Proper Use of Dynamic Binding, for tips to avoid making your programs hard to understand.
nil or omitted argument
does not enable the minor mode unconditionally; instead, it toggles
the minor mode—which is the straightforward thing to do, since that
is the behavior when invoked interactively. One downside is that it
is more troublesome to enable minor modes from hooks; you have to do
something like
(add-hook 'foo-hook (lambda () (bar-mode 1)))
or define turn-on-bar-mode and call that from the hook.
prog-mode dummy major mode has been removed. Instead of
using it as a crutch to meet programming mode conventions, you should
explicitly ensure that your mode follows those conventions.
See section Major Mode Conventions.
bidi-string-mark-left-to-right has been removed; so have many
other functions and variables related to bidirectional display.
Unicode directionality characters like U+200E ("left-to-right
mark") have no special effect on display.
window-parent, window parameters related to window arrangement,
and window-local buffer lists have all been removed. Functions for
resizing windows can delete windows if they become too small.
The “action function” feature for controlling buffer display has
been removed, including display-buffer-overriding-action and
related variables, as well as the action argument to
display-buffer and other functions. The way to
programmatically control how Emacs chooses a window to display a
buffer is to bind the right combination of pop-up-frames and
other variables.
completion-extra-properties variable, the metadata
action flag for completion functions, and the concept of
“completion categories”. Lisp programmers may now find the choice
of methods for tuning completion less bewildering, but if a package
finds the streamlined interface insufficient for its needs, it must
implement its own specialized completion feature.
copy-directory now behaves the same whether or not the
destination is an existing directory: if the destination exists, the
contents of the first directory are copied into it (with
subdirectories handled recursively), rather than copying the first
directory into a subdirectory.
delete-file and
delete-directory have been removed. The variable
delete-by-moving-to-trash must now be used with care; whenever
it is non-nil, all calls to delete-file or
delete-directory use the trash.
copy-file has been
removed. The return value of backup-buffer no longer has an
entry for the SELinux file context.
(type item-name cache . binding)
The cache entry is used internally by Emacs to record equivalent keyboard key sequences for invoking the same command; Lisp programs should never use it.
gnutls library has been removed, and the function
open-network-stream correspondingly simplified.
Lisp programs that want an encrypted network connection must now call
external utilities such as starttls or gnutls-cli.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. http://fsf.org/ Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
The purpose of this License is to make a manual, textbook, or other functional and useful document free in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others.
This License is a kind of “copyleft”, which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software.
We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference.
This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The “Document”, below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as “you”. You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law.
A “Modified Version” of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language.
A “Secondary Section” is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document’s overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.
The “Invariant Sections” are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none.
The “Cover Texts” are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words.
A “Transparent” copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not “Transparent” is called “Opaque”.
Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only.
The “Title Page” means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, “Title Page” means the text near the most prominent appearance of the work’s title, preceding the beginning of the body of the text.
The “publisher” means any person or entity that distributes copies of the Document to the public.
A section “Entitled XYZ” means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as “Acknowledgements”, “Dedications”, “Endorsements”, or “History”.) To “Preserve the Title” of such a section when you modify the Document means that it remains a section “Entitled XYZ” according to this definition.
The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License.
You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3.
You may also lend copies, under the same conditions stated above, and you may publicly display copies.
If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document’s license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects.
If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.
If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public.
It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document.
You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version:
If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version’s license notice. These titles must be distinct from any other section titles.
You may add a section Entitled “Endorsements”, provided it contains nothing but endorsements of your Modified Version by various parties—for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard.
You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one.
The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version.
You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers.
The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work.
In the combination, you must combine any sections Entitled “History” in the various original documents, forming one section Entitled “History”; likewise combine any sections Entitled “Acknowledgements”, and any sections Entitled “Dedications”. You must delete all sections Entitled “Endorsements.”
You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects.
You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document.
A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an “aggregate” if the copyright resulting from the compilation is not used to limit the legal rights of the compilation’s users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document.
If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document’s Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate.
Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail.
If a section in the Document is Entitled “Acknowledgements”, “Dedications”, or “History”, the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title.
You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License.
However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.
Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it.
The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/.
Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License “or any later version” applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy’s public statement of acceptance of a version permanently authorizes you to choose that version for the Document.
“Massive Multiauthor Collaboration Site” (or “MMC Site”) means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A “Massive Multiauthor Collaboration” (or “MMC”) contained in the site means any set of copyrightable works thus published on the MMC site.
“CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization.
“Incorporate” means to publish or republish a Document, in whole or in part, as part of another Document.
An MMC is “eligible for relicensing” if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008.
The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing.
To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page:
Copyright (C) year your name. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''.
If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the “with…Texts.” line with this:
with the Invariant Sections being list their titles, with
the Front-Cover Texts being list, and with the Back-Cover Texts
being list.
If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation.
If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Copyright © 2007 Free Software Foundation, Inc. http://fsf.org/ Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
The GNU General Public License is a free, copyleft license for software and other kinds of works.
The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program—to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.
When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.
For the developers’ and authors’ protection, the GPL clearly explains that there is no warranty for this free software. For both users’ and authors’ sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.
Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users’ freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and modification follow.
“This License” refers to version 3 of the GNU General Public License.
“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.
“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.
To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.
A “covered work” means either the unmodified Program or a work based on the Program.
To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.
To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.
The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.
A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.
The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.
The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work’s System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.
The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.
The Corresponding Source for a work in source code form is that same work.
All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.
When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work’s users, your or third parties’ legal rights to forbid circumvention of technological measures.
You may convey verbatim copies of the Program’s source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.
You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:
A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation’s users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.
You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:
A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.
A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.
“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.
If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).
The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.
“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:
All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.
You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).
However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.
Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.
You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.
Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.
An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party’s predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.
A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor’s “contributor version”.
A contributor’s “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor’s essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.
In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.
If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient’s use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.
A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.
If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.
Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.
The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.
If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy’s public statement of acceptance of a version permanently authorizes you to choose that version for the Program.
Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.
If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.
one line to give the program's name and a brief idea of what it does. Copyright (C) year name of author This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:
program Copyright (C) year name of author This program comes with ABSOLUTELY NO WARRANTY; for details type ‘show w’. This is free software, and you are welcome to redistribute it under certain conditions; type ‘show c’ for details.
The hypothetical commands ‘show w’ and ‘show c’ should show the appropriate parts of the General Public License. Of course, your program’s commands might be different; for a GUI interface, you would use an “about box”.
You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see http://www.gnu.org/licenses/.
The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read http://www.gnu.org/philosophy/why-not-lgpl.html.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This chapter describes no additional features of Emacs Lisp. Instead it gives advice on making effective use of the features described in the previous chapters, and describes conventions Emacs Lisp programmers should follow.
You can automatically check some of the conventions described below by running the command M-x checkdoc RET when visiting a Lisp file. It cannot check all of the conventions, and not all the warnings it gives necessarily correspond to problems, but it is worth examining them all.
| D.1 Emacs Lisp Coding Conventions | Conventions for clean and robust programs. | |
| D.2 Key Binding Conventions | Which keys should be bound by which programs. | |
| D.3 Emacs Programming Tips | Making Emacs code fit smoothly in Emacs. | |
| D.4 Tips for Making Compiled Code Fast | Making compiled code run fast. | |
| D.5 Tips for Avoiding Compiler Warnings | Turning off compiler warnings. | |
| D.6 Tips for Documentation Strings | Writing readable documentation strings. | |
| D.7 Tips on Writing Comments | Conventions for writing comments. | |
| D.8 Conventional Headers for Emacs Libraries | Standard headers for library packages. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here are conventions that you should follow when writing Emacs Lisp code intended for widespread use:
This convention is mandatory for any file that includes custom definitions. If fixing such a file to follow this convention requires an incompatible change, go ahead and make the incompatible change; don’t postpone it.
Occasionally, for a command name intended for users to use, it is more convenient if some words come before the package’s name prefix. And constructs that define functions, variables, etc., work better if they start with ‘defun’ or ‘defvar’, so put the name prefix later on in the name.
This recommendation applies even to names for traditional Lisp
primitives that are not primitives in Emacs Lisp—such as
copy-list. Believe it or not, there is more than one plausible
way to define copy-list. Play it safe; append your name prefix
to produce a name like foo-copy-list or mylib-copy-list
instead.
If you write a function that you think ought to be added to Emacs under
a certain name, such as twiddle-files, don’t call it by that name
in your program. Call it mylib-twiddle-files in your program,
and send mail to ‘bug-gnu-emacs@gnu.org’ suggesting we add
it to Emacs. If and when we do, we can change the name easily enough.
If one prefix is insufficient, your package can use two or three alternative common prefixes, so long as they make sense.
provide at the end of each separate Lisp file.
See section Features.
require to make sure they are loaded.
See section Features.
(eval-when-compile (require 'bar))
This tells Emacs to load bar just before byte-compiling
foo, so that the macro definition is available during
compilation. Using eval-when-compile avoids loading bar
when the compiled version of foo is used. It should be
called before the first use of the macro in the file. See section Macros and Byte Compilation.
require that library at the top-level and be done
with it. But if your file contains several independent features, and
only one or two require the extra library, then consider putting
require statements inside the relevant functions rather than at
the top-level. Or use autoload statements to load the extra
library when needed. This way people who don’t use those aspects of
your file do not need to load the extra library.
cl-lib library
rather than the old cl library. The latter does not
use a clean namespace (i.e., its definitions do not
start with a ‘cl-’ prefix). If your package loads cl at
run time, that could cause name clashes for users who don’t use that
package.
There is no problem with using the cl package at compile
time, with (eval-when-compile (require 'cl)). That’s
sufficient for using the macros in the cl package, because the
compiler expands them before generating the byte-code. It is still
better to use the more modern cl-lib in this case, though.
framep and frame-live-p.
feature-unload-hook, where feature is the name of
the feature the package provides, and make it undo any such changes.
Using unload-feature to unload the file will run this function.
See section Unloading.
(defalias 'gnus-point-at-bol
(if (fboundp 'point-at-bol)
'point-at-bol
'line-beginning-position))
eval-after-load in libraries and packages
(see section Hooks for Loading). This feature is meant for personal
customizations; using it in a Lisp program is unclean, because it
modifies the behavior of another Lisp file in a way that’s not visible
in that file. This is an obstacle for debugging, much like advising a
function in the other package.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
follow-link
condition, so that the link obeys mouse-1-click-follows-link.
See section Defining Clickable Text. See section Buttons, for an easy method of
implementing such clickable links.
Changing all the Emacs major modes to respect this convention was a lot of work; abandoning this convention would make that work go to waste, and inconvenience users. Please comply with it.
The reason for this rule is that a non-prefix binding for ESC in any context prevents recognition of escape sequences as function keys in that context.
For a state that accepts ordinary Emacs commands, or more generally any kind of state in which ESC followed by a function key or arrow key is potentially meaningful, then you must not define ESC ESC, since that would preclude recognizing an escape sequence after ESC. In these states, you should define ESC ESC ESC as the way to escape. Otherwise, define ESC ESC instead.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Following these conventions will make your program fit better into Emacs when it runs.
next-line or previous-line in programs; nearly
always, forward-line is more convenient as well as more
predictable and robust. See section Motion by Text Lines.
In particular, don’t use any of these functions:
beginning-of-buffer, end-of-buffer
replace-string, replace-regexp
insert-file, insert-buffer
If you just want to move point, or replace a certain string, or insert a file or buffer’s contents, without any of the other features intended for interactive users, you can replace these functions with one or two lines of simple Lisp code.
Vectors are advantageous for tables that are substantial in size and are accessed in random order (not searched front to back), provided there is no need to insert or delete elements (only lists allow that).
message function, not princ. See section The Echo Area.
error
(or signal). The function error does not return.
See section How to Signal an Error.
Don’t use message, throw, sleep-for, or
beep to report errors.
yes-or-no-p or
y-or-n-p should start with a capital letter and end with
‘? ’.
Enter the answer (default 42):
interactive, if you use a Lisp expression to produce a list
of arguments, don’t try to provide the “correct” default values for
region or position arguments. Instead, provide nil for those
arguments if they were not specified, and have the function body
compute the default value when the argument is nil. For
instance, write this:
(defun foo (pos) (interactive (list (if specified specified-pos))) (unless pos (setq pos default-pos)) ...)
rather than this:
(defun foo (pos)
(interactive
(list (if specified specified-pos
default-pos)))
...)
This is so that repetition of the command will recompute these defaults based on the current circumstances.
You do not need to take such precautions when you use interactive specs ‘d’, ‘m’ and ‘r’, because they make special arrangements to recompute the argument values on repetition of the command.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here are ways of improving the execution speed of byte-compiled Lisp programs.
memq, member,
assq, or assoc is even faster than explicit iteration. It
can be worth rearranging a data structure so that one of these primitive
search functions can be used.
byte-compile
property. If the property is non-nil, then the function is
handled specially.
For example, the following input will show you that aref is
compiled specially (see section Functions that Operate on Arrays):
(get 'aref 'byte-compile)
⇒ byte-compile-two-args
Note that in this case (and many others), you must first load the
bytecomp library, which defines the byte-compile property.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
defvar definitions for these variables, like this:
(defvar foo)
Such a definition has no effect except to tell the compiler
not to warn about uses of the variable foo in this file.
declare-function
statement (see section Telling the Compiler that a Function is Defined).
require for that package to avoid compilation warnings
for them. For instance,
(eval-when-compile (require 'foo))
with-no-warnings. See section Compiler Errors.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here are some tips and conventions for the writing of documentation strings. You can check many of these conventions by running the command M-x checkdoc-minor-mode.
apropos.
You can fill the text if that looks good. Emacs Lisp mode fills
documentation strings to the width specified by
emacs-lisp-docstring-fill-column. However, you can sometimes
make a documentation string much more readable by adjusting its line
breaks with care. Use blank lines between sections if the
documentation string is long.
For a function, the first line should briefly answer the question, “What does this function do?” For a variable, the first line should briefly answer the question, “What does this value mean?”
Don’t limit the documentation string to one line; use as many lines as you need to explain the details of how to use the function or variable. Please use complete sentences for the rest of the text too.
eval refers to its first argument as ‘FORM’, because the
actual argument name is form:
Evaluate FORM and return its value.
Also write metasyntactic variables in capital letters, such as when you show the decomposition of a list or vector into subunits, some of which may vary. ‘KEY’ and ‘VALUE’ in the following example illustrate this practice:
The argument TABLE should be an alist whose elements have the form (KEY . VALUE). Here, KEY is ...
foo, write “foo”, not
“Foo” (which is a different symbol).
This might appear to contradict the policy of writing function argument values, but there is no real contradiction; the argument value is not the same thing as the symbol that the function uses to hold the value.
If this puts a lower-case letter at the beginning of a sentence and that annoys you, rewrite the sentence so that the symbol is not at the start of it.
Help mode automatically creates a hyperlink when a documentation string uses a symbol name inside single quotes, if the symbol has either a function or a variable definition. You do not need to do anything special to make use of this feature. However, when a symbol has both a function definition and a variable definition, and you want to refer to just one of them, you can specify which one by writing one of the words ‘variable’, ‘option’, ‘function’, or ‘command’, immediately before the symbol name. (Case makes no difference in recognizing these indicator words.) For example, if you write
This function sets the variable `buffer-file-name'.
then the hyperlink will refer only to the variable documentation of
buffer-file-name, and not to its function documentation.
If a symbol has a function definition and/or a variable definition, but those are irrelevant to the use of the symbol that you are documenting, you can write the words ‘symbol’ or ‘program’ before the symbol name to prevent making any hyperlink. For example,
If the argument KIND-OF-RESULT is the symbol `list', this function returns a list of all the objects that satisfy the criterion.
does not make a hyperlink to the documentation, irrelevant here, of the
function list.
Normally, no hyperlink is made for a variable without variable documentation. You can force a hyperlink for such variables by preceding them with one of the words ‘variable’ or ‘option’.
Hyperlinks for faces are only made if the face name is preceded or followed by the word ‘face’. In that case, only the face documentation will be shown, even if the symbol is also defined as a variable or as a function.
To make a hyperlink to Info documentation, write the name of the Info node (or anchor) in single quotes, preceded by ‘info node’, ‘Info node’, ‘info anchor’ or ‘Info anchor’. The Info file name defaults to ‘emacs’. For example,
See Info node `Font Lock' and Info node `(elisp)Font Lock Basics'.
Finally, to create a hyperlink to URLs, write the URL in single quotes, preceded by ‘URL’. For example,
The home page for the GNU project has more information (see URL `http://www.gnu.org/').
forward-char.
(This is normally ‘C-f’, but it may be some other character if the
user has moved key bindings.) See section Substituting Key Bindings in Documentation.
It is not practical to use ‘\\[…]’ very many times, because display of the documentation string will become slow. So use this to describe the most important commands in your major mode, and then use ‘\\{…}’ to display the rest of the mode’s keymap.
The argument FOO can be either a number \(a buffer position) or a string (a file name).
This prevents the open-parenthesis from being treated as the start of a defun (see Defuns in The GNU Emacs Manual).
dired-find-file is:
In Dired, visit the file or directory named on this line.
defcustom. See section Defining Global Variables.
nil values are equivalent and indicate explicitly what
nil and non-nil mean.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
We recommend these conventions for comments:
Comments that start with a single semicolon, ‘;’, should all be aligned to the same column on the right of the source code. Such comments usually explain how the code on that line does its job. For example:
(setq base-version-list ; There was a base
(assoc (substring fn 0 start-vn) ; version to which
file-version-assoc-list)) ; this looks like
; a subversion.
Comments that start with two semicolons, ‘;;’, should be aligned to the same level of indentation as the code. Such comments usually describe the purpose of the following lines or the state of the program at that point. For example:
(prog1 (setq auto-fill-function
…
…
;; Update mode line.
(force-mode-line-update)))
We also normally use two semicolons for comments outside functions.
;; This Lisp code is run in Emacs when it is to operate as ;; a server for other processes.
If a function has no documentation string, it should instead have a two-semicolon comment right before the function, explaining what the function does and how to call it properly. Explain precisely what each argument means and how the function interprets its possible values. It is much better to convert such comments to documentation strings, though.
Comments that start with three semicolons, ‘;;;’, should start at the left margin. We use them for comments which should be considered a “heading” by Outline minor mode. By default, comments starting with at least three semicolons (followed by a single space and a non-whitespace character) are considered headings, comments starting with two or fewer are not. Historically, triple-semicolon comments have also been used for commenting out lines within a function, but this use is discouraged.
When commenting out entire functions, use two semicolons.
Comments that start with four semicolons, ‘;;;;’, should be aligned to the left margin and are used for headings of major sections of a program. For example:
;;;; The kill ring
Generally speaking, the M-; (comment-dwim) command
automatically starts a comment of the appropriate type; or indents an
existing comment to the right place, depending on the number of
semicolons.
See Manipulating Comments in The GNU Emacs Manual.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs has conventions for using special comments in Lisp libraries to divide them into sections and give information such as who wrote them. Using a standard format for these items makes it easier for tools (and people) to extract the relevant information. This section explains these conventions, starting with an example:
;;; foo.el --- Support for the Foo programming language ;; Copyright (C) 2010-2015 Your Name
;; Author: Your Name <yourname@example.com> ;; Maintainer: Someone Else <someone@example.com> ;; Created: 14 Jul 2010
;; Keywords: languages ;; Homepage: http://example.com/foo ;; This file is not part of GNU Emacs. ;; This file is free software… … ;; along with this file. If not, see <http://www.gnu.org/licenses/>.
The very first line should have this format:
;;; filename --- description
The description should be contained in one line. If the file needs a ‘-*-’ specification, put it after description. If this would make the first line too long, use a Local Variables section at the end of the file.
The copyright notice usually lists your name (if you wrote the file). If you have an employer who claims copyright on your work, you might need to list them instead. Do not say that the copyright holder is the Free Software Foundation (or that the file is part of GNU Emacs) unless your file has been accepted into the Emacs distribution. For more information on the form of copyright and license notices, see the guide on the GNU website.
After the copyright notice come several header comment lines, each beginning with ‘;; header-name:’. Here is a table of the conventional possibilities for header-name:
This line states the name and email address of at least the principal
author of the library. If there are multiple authors, list them on
continuation lines led by ;; and a tab or at least two spaces.
We recommend including a contact email address, of the form
‘<…>’. For example:
;; Author: Your Name <yourname@example.com> ;; Someone Else <someone@example.com> ;; Another Person <another@example.com>
This header has the same format as the Author header. It lists the person(s) who currently maintain(s) the file (respond to bug reports, etc.).
If there is no maintainer line, the person(s) in the Author field is/are presumed to be the maintainers. Some files in Emacs use ‘FSF’ for the maintainer. This means that the original author is no longer responsible for the file, and that it is maintained as part of Emacs.
This optional line gives the original creation date of the file, and is for historical interest only.
If you wish to record version numbers for the individual Lisp program, put them in this line. Lisp files distributed with Emacs generally do not have a ‘Version’ header, since the version number of Emacs itself serves the same purpose. If you are distributing a collection of multiple files, we recommend not writing the version in every file, but only the main one.
This line lists keywords for the finder-by-keyword help command.
Please use that command to see a list of the meaningful keywords.
This field is how people will find your package when they’re looking for things by topic. To separate the keywords, you can use spaces, commas, or both.
The name of this field is unfortunate, since people often assume it is the place to write arbitrary keywords that describe their package, rather than just the relevant Finder keywords.
This line states the homepage of the library.
If ‘Version’ is not suitable for use by the package manager, then
a package can define ‘Package-Version’; it will be used instead.
This is handy if ‘Version’ is an RCS id or something else that
cannot be parsed by version-to-list. See section Packaging Basics.
If this exists, it names packages on which the current package depends for proper operation. See section Packaging Basics. This is used by the package manager both at download time (to ensure that a complete set of packages is downloaded) and at activation time (to ensure that a package is only activated if all its dependencies have been).
Its format is a list of lists. The car of each sub-list is the
name of a package, as a symbol. The cadr of each sub-list is
the minimum acceptable version number, as a string. For instance:
;; Package-Requires: ((gnus "1.0") (bubbles "2.7.2"))
The package code automatically defines a package named ‘emacs’ with the version number of the currently running Emacs. This can be used to require a minimal version of Emacs for a package.
Just about every Lisp library ought to have the ‘Author’ and ‘Keywords’ header comment lines. Use the others if they are appropriate. You can also put in header lines with other header names—they have no standard meanings, so they can’t do any harm.
We use additional stylized comments to subdivide the contents of the library file. These should be separated from anything else by blank lines. Here is a table of them:
This begins introductory comments that explain how the library works. It should come right after the copying permissions, terminated by a ‘Change Log’, ‘History’ or ‘Code’ comment line. This text is used by the Finder package, so it should make sense in that context.
This begins an optional log of changes to the file over time. Don’t put too much information in this section—it is better to keep the detailed logs in a version control system (as Emacs does) or in a separate ChangeLog file. ‘History’ is an alternative to ‘Change Log’.
This begins the actual code of the program.
This is the footer line; it appears at the very end of the file. Its purpose is to enable people to detect truncated versions of the file from the lack of a footer line.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This chapter describes how the runnable Emacs executable is dumped with the preloaded Lisp libraries in it, how storage is allocated, and some internal aspects of GNU Emacs that may be of interest to C programmers.
| E.1 Building Emacs | How the dumped Emacs is made. | |
| E.2 Pure Storage | Kludge to make preloaded Lisp functions shareable. | |
| E.3 Garbage Collection | Reclaiming space for Lisp objects no longer used. | |
| E.4 Memory Usage | Info about total size of Lisp objects made so far. | |
| E.5 C Dialect | What C variant Emacs is written in. | |
| E.6 Writing Emacs Primitives | Writing C code for Emacs. | |
| E.7 Object Internals | Data formats of buffers, windows, processes. | |
| E.8 C Integer Types | How C integer types are used inside Emacs. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section explains the steps involved in building the Emacs executable. You don’t have to know this material to build and install Emacs, since the makefiles do all these things automatically. This information is pertinent to Emacs developers.
Compilation of the C source files in the src directory produces an executable file called temacs, also called a bare impure Emacs. It contains the Emacs Lisp interpreter and I/O routines, but not the editing commands.
The command temacs -l loadup would run temacs
and direct it to load loadup.el. The loadup library
loads additional Lisp libraries, which set up the normal Emacs editing
environment. After this step, the Emacs executable is no longer
bare.
Because it takes some time to load the standard Lisp files, the
temacs executable usually isn’t run directly by users.
Instead, as one of the last steps of building Emacs, the command
‘temacs -batch -l loadup dump’ is run. The special ‘dump’
argument causes temacs to dump out an executable program,
called emacs, which has all the standard Lisp files preloaded.
(The ‘-batch’ argument prevents temacs from trying to
initialize any of its data on the terminal, so that the tables of
terminal information are empty in the dumped Emacs.)
The dumped emacs executable (also called a pure Emacs)
is the one which is installed. The variable
preloaded-file-list stores a list of the Lisp files preloaded
into the dumped Emacs. If you port Emacs to a new operating system,
and are not able to implement dumping, then Emacs must load
loadup.el each time it starts.
You can specify additional files to preload by writing a library named site-load.el that loads them. You may need to rebuild Emacs with an added definition
#define SITELOAD_PURESIZE_EXTRA n
to make n added bytes of pure space to hold the additional files; see src/puresize.h. (Try adding increments of 20000 until it is big enough.) However, the advantage of preloading additional files decreases as machines get faster. On modern machines, it is usually not advisable.
After loadup.el reads site-load.el, it finds the
documentation strings for primitive and preloaded functions (and
variables) in the file etc/DOC where they are stored, by
calling Snarf-documentation (see Accessing Documentation).
You can specify other Lisp expressions to execute just before dumping by putting them in a library named site-init.el. This file is executed after the documentation strings are found.
If you want to preload function or variable definitions, there are three ways you can do this and make their documentation strings accessible when you subsequently run Emacs:
nil value for byte-compile-dynamic-docstrings
as a local variable in each of these files, and load them with either
site-load.el or site-init.el. (This method has the
drawback that the documentation strings take up space in Emacs all the
time.)
It is not advisable to put anything in site-load.el or
site-init.el that would alter any of the features that users
expect in an ordinary unmodified Emacs. If you feel you must override
normal features for your site, do it with default.el, so that
users can override your changes if they wish. See section Summary: Sequence of Actions at Startup.
Note that if either site-load.el or site-init.el changes
load-path, the changes will be lost after dumping.
See section Library Search. To make a permanent change to
load-path, use the --enable-locallisppath option
of configure.
In a package that can be preloaded, it is sometimes necessary (or
useful) to delay certain evaluations until Emacs subsequently starts
up. The vast majority of such cases relate to the values of
customizable variables. For example, tutorial-directory is a
variable defined in startup.el, which is preloaded. The default
value is set based on data-directory. The variable needs to
access the value of data-directory when Emacs starts, not when
it is dumped, because the Emacs executable has probably been installed
in a different location since it was dumped.
This function delays the initialization of symbol to the next
Emacs start. You normally use this function by specifying it as the
:initialize property of a customizable variable. (The argument
value is unused, and is provided only for compatibility with the
form Custom expects.)
In the unlikely event that you need a more general functionality than
custom-initialize-delay provides, you can use
before-init-hook (see section Summary: Sequence of Actions at Startup).
This function dumps the current state of Emacs into an executable file to-file. It takes symbols from from-file (this is normally the executable file temacs).
If you want to use this function in an Emacs that was already dumped, you must run Emacs with ‘-batch’.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lisp uses two kinds of storage for user-created Lisp objects: normal storage and pure storage. Normal storage is where all the new data created during an Emacs session are kept (see section Garbage Collection). Pure storage is used for certain data in the preloaded standard Lisp files—data that should never change during actual use of Emacs.
Pure storage is allocated only while temacs is loading the
standard preloaded Lisp libraries. In the file emacs, it is
marked as read-only (on operating systems that permit this), so that
the memory space can be shared by all the Emacs jobs running on the
machine at once. Pure storage is not expandable; a fixed amount is
allocated when Emacs is compiled, and if that is not sufficient for
the preloaded libraries, temacs allocates dynamic memory for
the part that didn’t fit. The resulting image will work, but garbage
collection (see section Garbage Collection) is disabled in this situation,
causing a memory leak. Such an overflow normally won’t happen unless
you try to preload additional libraries or add features to the
standard ones. Emacs will display a warning about the overflow when
it starts. If this happens, you should increase the compilation
parameter SYSTEM_PURESIZE_EXTRA in the file
src/puresize.h and rebuild Emacs.
This function makes a copy in pure storage of object, and returns it. It copies a string by simply making a new string with the same characters, but without text properties, in pure storage. It recursively copies the contents of vectors and cons cells. It does not make copies of other objects such as symbols, but just returns them unchanged. It signals an error if asked to copy markers.
This function is a no-op except while Emacs is being built and dumped; it is usually called only in preloaded Lisp files.
The value of this variable is the number of bytes of pure storage allocated so far. Typically, in a dumped Emacs, this number is very close to the total amount of pure storage available—if it were not, we would preallocate less.
This variable determines whether defun should make a copy of the
function definition in pure storage. If it is non-nil, then the
function definition is copied into pure storage.
This flag is t while loading all of the basic functions for
building Emacs initially (allowing those functions to be shareable and
non-collectible). Dumping Emacs as an executable always writes
nil in this variable, regardless of the value it actually has
before and after dumping.
You should not change this flag in a running Emacs.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When a program creates a list or the user defines a new function (such as by loading a library), that data is placed in normal storage. If normal storage runs low, then Emacs asks the operating system to allocate more memory. Different types of Lisp objects, such as symbols, cons cells, small vectors, markers, etc., are segregated in distinct blocks in memory. (Large vectors, long strings, buffers and certain other editing types, which are fairly large, are allocated in individual blocks, one per object; small strings are packed into blocks of 8k bytes, and small vectors are packed into blocks of 4k bytes).
Beyond the basic vector, a lot of objects like window, buffer, and
frame are managed as if they were vectors. The corresponding C data
structures include the struct vectorlike_header field whose
size member contains the subtype enumerated by enum pvec_type
and an information about how many Lisp_Object fields this structure
contains and what the size of the rest data is. This information is
needed to calculate the memory footprint of an object, and used
by the vector allocation code while iterating over the vector blocks.
It is quite common to use some storage for a while, then release it by (for example) killing a buffer or deleting the last pointer to an object. Emacs provides a garbage collector to reclaim this abandoned storage. The garbage collector operates by finding and marking all Lisp objects that are still accessible to Lisp programs. To begin with, it assumes all the symbols, their values and associated function definitions, and any data presently on the stack, are accessible. Any objects that can be reached indirectly through other accessible objects are also accessible.
When marking is finished, all objects still unmarked are garbage. No matter what the Lisp program or the user does, it is impossible to refer to them, since there is no longer a way to reach them. Their space might as well be reused, since no one will miss them. The second (“sweep”) phase of the garbage collector arranges to reuse them.
The sweep phase puts unused cons cells onto a free list for future allocation; likewise for symbols and markers. It compacts the accessible strings so they occupy fewer 8k blocks; then it frees the other 8k blocks. Unreachable vectors from vector blocks are coalesced to create largest possible free areas; if a free area spans a complete 4k block, that block is freed. Otherwise, the free area is recorded in a free list array, where each entry corresponds to a free list of areas of the same size. Large vectors, buffers, and other large objects are allocated and freed individually.
Common Lisp note: Unlike other Lisps, GNU Emacs Lisp does not call the garbage collector when the free list is empty. Instead, it simply requests the operating system to allocate more storage, and processing continues until
gc-cons-thresholdbytes have been used.This means that you can make sure that the garbage collector will not run during a certain portion of a Lisp program by calling the garbage collector explicitly just before it (provided that portion of the program does not use so much space as to force a second garbage collection).
This command runs a garbage collection, and returns information on
the amount of space in use. (Garbage collection can also occur
spontaneously if you use more than gc-cons-threshold bytes of
Lisp data since the previous garbage collection.)
garbage-collect returns a list with information on amount of space in
use, where each entry has the form ‘(name size used)’
or ‘(name size used free)’. In the entry,
name is a symbol describing the kind of objects this entry represents,
size is the number of bytes used by each one, used is the number
of those objects that were found live in the heap, and optional free is
the number of those objects that are not live but that Emacs keeps around for
future allocations. So an overall result is:
((consescons-size used-conses free-conses) (symbolssymbol-size used-symbols free-symbols) (miscsmisc-size used-miscs free-miscs) (stringsstring-size used-strings free-strings) (string-bytesbyte-size used-bytes) (vectorsvector-size used-vectors) (vector-slotsslot-size used-slots free-slots) (floatsfloat-size used-floats free-floats) (intervalsinterval-size used-intervals free-intervals) (buffersbuffer-size used-buffers) (heapunit-size total-size free-size))
Here is an example:
(garbage-collect)
⇒ ((conses 16 49126 8058) (symbols 48 14607 0)
(miscs 40 34 56) (strings 32 2942 2607)
(string-bytes 1 78607) (vectors 16 7247)
(vector-slots 8 341609 29474) (floats 8 71 102)
(intervals 56 27 26) (buffers 944 8)
(heap 1024 11715 2678))
Below is a table explaining each element. Note that last heap entry
is optional and present only if an underlying malloc implementation
provides mallinfo function.
Internal size of a cons cell, i.e., sizeof (struct Lisp_Cons).
The number of cons cells in use.
The number of cons cells for which space has been obtained from the operating system, but that are not currently being used.
Internal size of a symbol, i.e., sizeof (struct Lisp_Symbol).
The number of symbols in use.
The number of symbols for which space has been obtained from the operating system, but that are not currently being used.
Internal size of a miscellaneous entity, i.e.,
sizeof (union Lisp_Misc), which is a size of the
largest type enumerated in enum Lisp_Misc_Type.
The number of miscellaneous objects in use. These include markers and overlays, plus certain objects not visible to users.
The number of miscellaneous objects for which space has been obtained from the operating system, but that are not currently being used.
Internal size of a string header, i.e., sizeof (struct Lisp_String).
The number of string headers in use.
The number of string headers for which space has been obtained from the operating system, but that are not currently being used.
This is used for convenience and equals to sizeof (char).
The total size of all string data in bytes.
Internal size of a vector header, i.e., sizeof (struct Lisp_Vector).
The number of vector headers allocated from the vector blocks.
Internal size of a vector slot, always equal to sizeof (Lisp_Object).
The number of slots in all used vectors.
The number of free slots in all vector blocks.
Internal size of a float object, i.e., sizeof (struct Lisp_Float).
(Do not confuse it with the native platform float or double.)
The number of floats in use.
The number of floats for which space has been obtained from the operating system, but that are not currently being used.
Internal size of an interval object, i.e., sizeof (struct interval).
The number of intervals in use.
The number of intervals for which space has been obtained from the operating system, but that are not currently being used.
Internal size of a buffer, i.e., sizeof (struct buffer).
(Do not confuse with the value returned by buffer-size function.)
The number of buffer objects in use. This includes killed buffers
invisible to users, i.e., all buffers in all_buffers list.
The unit of heap space measurement, always equal to 1024 bytes.
Total heap size, in unit-size units.
Heap space which is not currently used, in unit-size units.
If there was overflow in pure space (see section Pure Storage),
garbage-collect returns nil, because a real garbage
collection cannot be done.
If this variable is non-nil, Emacs displays a message at the
beginning and end of garbage collection. The default value is
nil.
This is a normal hook that is run at the end of garbage collection. Garbage collection is inhibited while the hook functions run, so be careful writing them.
The value of this variable is the number of bytes of storage that must
be allocated for Lisp objects after one garbage collection in order to
trigger another garbage collection. You can use the result returned by
garbage-collect to get an information about size of the particular
object type; space allocated to the contents of buffers does not count.
Note that the subsequent garbage collection does not happen immediately
when the threshold is exhausted, but only the next time the Lisp interpreter
is called.
The initial threshold value is GC_DEFAULT_THRESHOLD, defined in
alloc.c. Since it’s defined in word_size units, the value
is 400,000 for the default 32-bit configuration and 800,000 for the 64-bit
one. If you specify a larger value, garbage collection will happen less
often. This reduces the amount of time spent garbage collecting, but
increases total memory use. You may want to do this when running a program
that creates lots of Lisp data.
You can make collections more frequent by specifying a smaller value, down
to 1/10th of GC_DEFAULT_THRESHOLD. A value less than this minimum
will remain in effect only until the subsequent garbage collection, at which
time garbage-collect will set the threshold back to the minimum.
The value of this variable specifies the amount of consing before a
garbage collection occurs, as a fraction of the current heap size.
This criterion and gc-cons-threshold apply in parallel, and
garbage collection occurs only when both criteria are satisfied.
As the heap size increases, the time to perform a garbage collection increases. Thus, it can be desirable to do them less frequently in proportion.
The value returned by garbage-collect describes the amount of
memory used by Lisp data, broken down by data type. By contrast, the
function memory-limit provides information on the total amount of
memory Emacs is currently using.
This function returns the address of the last byte Emacs has allocated, divided by 1024. We divide the value by 1024 to make sure it fits in a Lisp integer.
You can use this to get a general idea of how your actions affect the memory usage.
This variable is t if Emacs is nearly out of memory for Lisp
objects, and nil otherwise.
This returns a list of numbers that count the number of objects created in this Emacs session. Each of these counters increments for a certain kind of object. See the documentation string for details.
This variable contains the total number of garbage collections done so far in this Emacs session.
This variable contains the total number of seconds of elapsed time during garbage collection so far in this Emacs session, as a floating-point number.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These functions and variables give information about the total amount
of memory allocation that Emacs has done, broken down by data type.
Note the difference between these and the values returned by
garbage-collect; those count objects that currently exist, but
these count the number or size of all allocations, including those for
objects that have since been freed.
The total number of cons cells that have been allocated so far in this Emacs session.
The total number of floats that have been allocated so far in this Emacs session.
The total number of vector cells that have been allocated so far in this Emacs session.
The total number of symbols that have been allocated so far in this Emacs session.
The total number of string characters that have been allocated so far in this session.
The total number of miscellaneous objects that have been allocated so far in this session. These include markers and overlays, plus certain objects not visible to users.
The total number of intervals that have been allocated so far in this Emacs session.
The total number of strings that have been allocated so far in this Emacs session.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The C part of Emacs is portable to C89: C99-specific features such as ‘<stdbool.h>’ and ‘inline’ are not used without a check, typically at configuration time, and the Emacs build procedure provides a substitute implementation if necessary. Some C99 features, such as declarations after statements, are too difficult to provide substitutes for, so they are avoided entirely.
At some point in the not-too-distant future the base C dialect will change from C89 to C99, and eventually it will no doubt change to C11.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lisp primitives are Lisp functions implemented in C. The details of interfacing the C function so that Lisp can call it are handled by a few C macros. The only way to really understand how to write new C code is to read the source, but we can explain some things here.
An example of a special form is the definition of or, from
eval.c. (An ordinary function would have the same general
appearance.)
DEFUN ("or", For, Sor, 0, UNEVALLED, 0,
doc: /* Eval args until one of them yields non-nil, then return
that value.
The remaining args are not evalled at all.
If all args return nil, return nil.
usage: (or CONDITIONS ...) */)
(Lisp_Object args)
{
register Lisp_Object val = Qnil;
struct gcpro gcpro1;
GCPRO1 (args);
while (CONSP (args))
{
val = eval_sub (XCAR (args));
if (!NILP (val))
break;
args = XCDR (args);
}
UNGCPRO; return val; }
Let’s start with a precise explanation of the arguments to the
DEFUN macro. Here is a template for them:
DEFUN (lname, fname, sname, min, max, interactive, doc)
This is the name of the Lisp symbol to define as the function name; in
the example above, it is or.
This is the C function name for this function. This is the name that
is used in C code for calling the function. The name is, by
convention, ‘F’ prepended to the Lisp name, with all dashes
(‘-’) in the Lisp name changed to underscores. Thus, to call
this function from C code, call For.
This is a C variable name to use for a structure that holds the data for the subr object that represents the function in Lisp. This structure conveys the Lisp symbol name to the initialization routine that will create the symbol and store the subr object as its definition. By convention, this name is always fname with ‘F’ replaced with ‘S’.
This is the minimum number of arguments that the function requires. The
function or allows a minimum of zero arguments.
This is the maximum number of arguments that the function accepts, if
there is a fixed maximum. Alternatively, it can be UNEVALLED,
indicating a special form that receives unevaluated arguments, or
MANY, indicating an unlimited number of evaluated arguments (the
equivalent of &rest). Both UNEVALLED and MANY are
macros. If max is a number, it must be more than min but
less than 8.
This is an interactive specification, a string such as might be used
as the argument of interactive in a Lisp function. In the case
of or, it is 0 (a null pointer), indicating that or
cannot be called interactively. A value of "" indicates a
function that should receive no arguments when called interactively.
If the value begins with a ‘"(’, the string is evaluated as a
Lisp form. For example:
DEFUN ("foo", Ffoo, Sfoo, 0, UNEVALLED,
"(list (read-char-by-name \"Insert character: \")\
(prefix-numeric-value current-prefix-arg)\
t))",
doc: /* … /*)
This is the documentation string. It uses C comment syntax rather than C string syntax because comment syntax requires nothing special to include multiple lines. The ‘doc:’ identifies the comment that follows as the documentation string. The ‘/*’ and ‘*/’ delimiters that begin and end the comment are not part of the documentation string.
If the last line of the documentation string begins with the keyword ‘usage:’, the rest of the line is treated as the argument list for documentation purposes. This way, you can use different argument names in the documentation string from the ones used in the C code. ‘usage:’ is required if the function has an unlimited number of arguments.
All the usual rules for documentation strings in Lisp code (see section Tips for Documentation Strings) apply to C code documentation strings too.
After the call to the DEFUN macro, you must write the
argument list for the C function, including the types for the
arguments. If the primitive accepts a fixed maximum number of Lisp
arguments, there must be one C argument for each Lisp argument, and
each argument must be of type Lisp_Object. (Various macros and
functions for creating values of type Lisp_Object are declared
in the file lisp.h.) If the primitive has no upper limit on
the number of Lisp arguments, it must have exactly two C arguments:
the first is the number of Lisp arguments, and the second is the
address of a block containing their values. These have types
int and Lisp_Object * respectively. Since
Lisp_Object can hold any Lisp object of any data type, you
can determine the actual data type only at run time; so if you want
a primitive to accept only a certain type of argument, you must check
the type explicitly using a suitable predicate (see section Type Predicates).
Within the function For itself, note the use of the macros
GCPRO1 and UNGCPRO. These macros are defined for the
sake of the few platforms which do not use Emacs’ default
stack-marking garbage collector. The GCPRO1 macro “protects”
a variable from garbage collection, explicitly informing the garbage
collector that that variable and all its contents must be as
accessible. GC protection is necessary in any function which can
perform Lisp evaluation by calling eval_sub or Feval as
a subroutine, either directly or indirectly.
It suffices to ensure that at least one pointer to each object is
GC-protected. Thus, a particular local variable can do without
protection if it is certain that the object it points to will be
preserved by some other pointer (such as another local variable that
has a GCPRO). Otherwise, the local variable needs a
GCPRO.
The macro GCPRO1 protects just one local variable. If you
want to protect two variables, use GCPRO2 instead; repeating
GCPRO1 will not work. Macros GCPRO3, GCPRO4,
GCPRO5, and GCPRO6 also exist. All these macros
implicitly use local variables such as gcpro1; you must declare
these explicitly, with type struct gcpro. Thus, if you use
GCPRO2, you must declare gcpro1 and gcpro2.
UNGCPRO cancels the protection of the variables that are
protected in the current function. It is necessary to do this
explicitly.
You must not use C initializers for static or global variables unless the variables are never written once Emacs is dumped. These variables with initializers are allocated in an area of memory that becomes read-only (on certain operating systems) as a result of dumping Emacs. See section Pure Storage.
Defining the C function is not enough to make a Lisp primitive available; you must also create the Lisp symbol for the primitive and store a suitable subr object in its function cell. The code looks like this:
defsubr (&sname);
Here sname is the name you used as the third argument to DEFUN.
If you add a new primitive to a file that already has Lisp primitives
defined in it, find the function (near the end of the file) named
syms_of_something, and add the call to defsubr
there. If the file doesn’t have this function, or if you create a new
file, add to it a syms_of_filename (e.g.,
syms_of_myfile). Then find the spot in emacs.c where all
of these functions are called, and add a call to
syms_of_filename there.
The function syms_of_filename is also the place to define
any C variables that are to be visible as Lisp variables.
DEFVAR_LISP makes a C variable of type Lisp_Object visible
in Lisp. DEFVAR_INT makes a C variable of type int
visible in Lisp with a value that is always an integer.
DEFVAR_BOOL makes a C variable of type int visible in Lisp
with a value that is either t or nil. Note that variables
defined with DEFVAR_BOOL are automatically added to the list
byte-boolean-vars used by the byte compiler.
If you want to make a Lisp variables that is defined in C behave
like one declared with defcustom, add an appropriate entry to
cus-start.el.
If you define a file-scope C variable of type Lisp_Object,
you must protect it from garbage-collection by calling staticpro
in syms_of_filename, like this:
staticpro (&variable);
Here is another example function, with more complicated arguments. This comes from the code in window.c, and it demonstrates the use of macros and functions to manipulate Lisp objects.
DEFUN ("coordinates-in-window-p", Fcoordinates_in_window_p,
Scoordinates_in_window_p, 2, 2, 0,
doc: /* Return non-nil if COORDINATES are in WINDOW.
...
or `right-margin' is returned. */)
(register Lisp_Object coordinates, Lisp_Object window)
{
struct window *w;
struct frame *f;
int x, y;
Lisp_Object lx, ly;
CHECK_LIVE_WINDOW (window); w = XWINDOW (window); f = XFRAME (w->frame); CHECK_CONS (coordinates); lx = Fcar (coordinates); ly = Fcdr (coordinates); CHECK_NUMBER_OR_FLOAT (lx); CHECK_NUMBER_OR_FLOAT (ly); x = FRAME_PIXEL_X_FROM_CANON_X (f, lx) + FRAME_INTERNAL_BORDER_WIDTH(f); y = FRAME_PIXEL_Y_FROM_CANON_Y (f, ly) + FRAME_INTERNAL_BORDER_WIDTH(f);
switch (coordinates_in_window (w, x, y))
{
case ON_NOTHING: /* NOT in window at all. */
return Qnil;
...
case ON_MODE_LINE: /* In mode line of window. */
return Qmode_line;
...
case ON_SCROLL_BAR: /* On scroll-bar of window. */
/* Historically we are supposed to return nil in this case. */
return Qnil;
default:
abort ();
}
}
Note that C code cannot call functions by name unless they are defined
in C. The way to call a function written in Lisp is to use
Ffuncall, which embodies the Lisp function funcall. Since
the Lisp function funcall accepts an unlimited number of
arguments, in C it takes two: the number of Lisp-level arguments, and a
one-dimensional array containing their values. The first Lisp-level
argument is the Lisp function to call, and the rest are the arguments to
pass to it. Since Ffuncall can call the evaluator, you must
protect pointers from garbage collection around the call to
Ffuncall.
The C functions call0, call1, call2, and so on,
provide handy ways to call a Lisp function conveniently with a fixed
number of arguments. They work by calling Ffuncall.
eval.c is a very good file to look through for examples; lisp.h contains the definitions for some important macros and functions.
If you define a function which is side-effect free, update the code
in byte-opt.el that binds side-effect-free-fns and
side-effect-and-error-free-fns so that the compiler optimizer
knows about it.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lisp provides a rich set of the data types. Some of them, like cons cells, integers and strings, are common to nearly all Lisp dialects. Some others, like markers and buffers, are quite special and needed to provide the basic support to write editor commands in Lisp. To implement such a variety of object types and provide an efficient way to pass objects between the subsystems of an interpreter, there is a set of C data structures and a special type to represent the pointers to all of them, which is known as tagged pointer.
In C, the tagged pointer is an object of type Lisp_Object. Any
initialized variable of such a type always holds the value of one of the
following basic data types: integer, symbol, string, cons cell, float,
vectorlike or miscellaneous object. Each of these data types has the
corresponding tag value. All tags are enumerated by enum Lisp_Type
and placed into a 3-bit bitfield of the Lisp_Object. The rest of the
bits is the value itself. Integers are immediate, i.e., directly
represented by those value bits, and all other objects are represented
by the C pointers to a corresponding object allocated from the heap. Width
of the Lisp_Object is platform- and configuration-dependent: usually
it’s equal to the width of an underlying platform pointer (i.e., 32-bit on
a 32-bit machine and 64-bit on a 64-bit one), but also there is a special
configuration where Lisp_Object is 64-bit but all pointers are 32-bit.
The latter trick was designed to overcome the limited range of values for
Lisp integers on a 32-bit system by using 64-bit long long type for
Lisp_Object.
The following C data structures are defined in lisp.h to represent the basic data types beyond integers:
struct Lisp_ConsCons cell, an object used to construct lists.
struct Lisp_StringString, the basic object to represent a sequence of characters.
struct Lisp_VectorArray, a fixed-size set of Lisp objects which may be accessed by an index.
struct Lisp_SymbolSymbol, the unique-named entity commonly used as an identifier.
struct Lisp_FloatFloating-point value.
union Lisp_MiscMiscellaneous kinds of objects which don’t fit into any of the above.
These types are the first-class citizens of an internal type system.
Since the tag space is limited, all other types are the subtypes of either
Lisp_Vectorlike or Lisp_Misc. Vector subtypes are enumerated
by enum pvec_type, and nearly all complex objects like windows, buffers,
frames, and processes fall into this category. The rest of special types,
including markers and overlays, are enumerated by enum Lisp_Misc_Type
and form the set of subtypes of Lisp_Misc.
Below there is a description of a few subtypes of Lisp_Vectorlike.
Buffer object represents the text to display and edit. Window is the part
of display structure which shows the buffer or used as a container to
recursively place other windows on the same frame. (Do not confuse Emacs Lisp
window object with the window as an entity managed by the user interface
system like X; in Emacs terminology, the latter is called frame.) Finally,
process object is used to manage the subprocesses.
| E.7.1 Buffer Internals | Components of a buffer structure. | |
| E.7.2 Window Internals | Components of a window structure. | |
| E.7.3 Process Internals | Components of a process structure. |
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Two structures (see buffer.h) are used to represent buffers
in C. The buffer_text structure contains fields describing the
text of a buffer; the buffer structure holds other fields. In
the case of indirect buffers, two or more buffer structures
reference the same buffer_text structure.
Here are some of the fields in struct buffer_text:
begThe address of the buffer contents.
gptgpt_byteThe character and byte positions of the buffer gap. See section The Buffer Gap.
zz_byteThe character and byte positions of the end of the buffer text.
gap_sizeThe size of buffer’s gap. See section The Buffer Gap.
modiffsave_modiffchars_modiffoverlay_modiffThese fields count the number of buffer-modification events performed
in this buffer. modiff is incremented after each
buffer-modification event, and is never otherwise changed;
save_modiff contains the value of modiff the last time
the buffer was visited or saved; chars_modiff counts only
modifications to the characters in the buffer, ignoring all other
kinds of changes; and overlay_modiff counts only modifications
to the overlays.
beg_unchangedend_unchangedThe number of characters at the start and end of the text that are known to be unchanged since the last complete redisplay.
unchanged_modifiedoverlay_unchanged_modifiedThe values of modiff and overlay_modiff, respectively,
after the last complete redisplay. If their current values match
modiff or overlay_modiff, that means
beg_unchanged and end_unchanged contain no useful
information.
markersThe markers that refer to this buffer. This is actually a single
marker, and successive elements in its marker chain are the other
markers referring to this buffer text.
intervalsThe interval tree which records the text properties of this buffer.
Some of the fields of struct buffer are:
headerA header of type struct vectorlike_header is common to all
vectorlike objects.
own_textA struct buffer_text structure that ordinarily holds the buffer
contents. In indirect buffers, this field is not used.
textA pointer to the buffer_text structure for this buffer. In an
ordinary buffer, this is the own_text field above. In an
indirect buffer, this is the own_text field of the base buffer.
nextA pointer to the next buffer, in the chain of all buffers, including killed buffers. This chain is used only for allocation and garbage collection, in order to collect killed buffers properly.
ptpt_byteThe character and byte positions of point in a buffer.
begvbegv_byteThe character and byte positions of the beginning of the accessible range of text in the buffer.
zvzv_byteThe character and byte positions of the end of the accessible range of text in the buffer.
base_bufferIn an indirect buffer, this points to the base buffer. In an ordinary buffer, it is null.
local_flagsThis field contains flags indicating that certain variables are local
in this buffer. Such variables are declared in the C code using
DEFVAR_PER_BUFFER, and their buffer-local bindings are stored
in fields in the buffer structure itself. (Some of these fields are
described in this table.)
modtimeThe modification time of the visited file. It is set when the file is written or read. Before writing the buffer into a file, this field is compared to the modification time of the file to see if the file has changed on disk. See section Buffer Modification.
auto_save_modifiedThe time when the buffer was last auto-saved.
last_window_startThe window-start position in the buffer as of the last time the
buffer was displayed in a window.
clip_changedThis flag indicates that narrowing has changed in the buffer. See section Narrowing.
prevent_redisplay_optimizations_pThis flag indicates that redisplay optimizations should not be used to display this buffer.
overlay_centerThis field holds the current overlay center position. See section Managing Overlays.
overlays_beforeoverlays_afterThese fields hold, respectively, a list of overlays that end at or
before the current overlay center, and a list of overlays that end
after the current overlay center. See section Managing Overlays.
overlays_before is sorted in order of decreasing end position,
and overlays_after is sorted in order of increasing beginning
position.
nameA Lisp string that names the buffer. It is guaranteed to be unique. See section Buffer Names.
save_lengthThe length of the file this buffer is visiting, when last read or
saved. This and other fields concerned with saving are not kept in
the buffer_text structure because indirect buffers are never
saved.
directoryThe directory for expanding relative file names. This is the value of
the buffer-local variable default-directory (see section Functions that Expand Filenames).
filenameThe name of the file visited in this buffer, or nil. This is
the value of the buffer-local variable buffer-file-name
(see section Buffer File Name).
undo_listbacked_upauto_save_file_nameauto_save_file_formatread_onlyfile_formatfile_truenameinvisibility_specdisplay_countdisplay_timeThese fields store the values of Lisp variables that are automatically
buffer-local (see section Buffer-Local Variables), whose corresponding
variable names have the additional prefix buffer- and have
underscores replaced with dashes. For instance, undo_list
stores the value of buffer-undo-list.
markThe mark for the buffer. The mark is a marker, hence it is also
included on the list markers. See section The Mark.
local_var_alistThe association list describing the buffer-local variable bindings of this buffer, not including the built-in buffer-local bindings that have special slots in the buffer object. (Those slots are omitted from this table.) See section Buffer-Local Variables.
major_modeSymbol naming the major mode of this buffer, e.g., lisp-mode.
mode_namePretty name of the major mode, e.g., "Lisp".
keymapabbrev_tablesyntax_tablecategory_tabledisplay_tableThese fields store the buffer’s local keymap (see section Keymaps), abbrev table (see section Abbrev Tables), syntax table (see section Syntax Tables), category table (see section Categories), and display table (see section Display Tables).
downcase_tableupcase_tablecase_canon_tableThese fields store the conversion tables for converting text to lower case, upper case, and for canonicalizing text for case-fold search. See section The Case Table.
minor_modesAn alist of the minor modes of this buffer.
pt_markerbegv_markerzv_markerThese fields are only used in an indirect buffer, or in a buffer that
is the base of an indirect buffer. Each holds a marker that records
pt, begv, and zv respectively, for this buffer
when the buffer is not current.
mode_line_formatheader_line_formatcase_fold_searchtab_widthfill_columnleft_marginauto_fill_functiontruncate_linesword_wrapctl_arrowbidi_display_reorderingbidi_paragraph_directionselective_displayselective_display_ellipsesoverwrite_modeabbrev_modemark_activeenable_multibyte_charactersbuffer_file_coding_systemcache_long_line_scanspoint_before_scrollleft_fringe_widthright_fringe_widthfringes_outside_marginsscroll_bar_widthindicate_empty_linesindicate_buffer_boundariesfringe_indicator_alistfringe_cursor_alistscroll_up_aggressivelyscroll_down_aggressivelycursor_typecursor_in_non_selected_windowsThese fields store the values of Lisp variables that are automatically
buffer-local (see section Buffer-Local Variables), whose corresponding
variable names have underscores replaced with dashes. For instance,
mode_line_format stores the value of mode-line-format.
last_selected_windowThis is the last window that was selected with this buffer in it, or nil
if that window no longer displays this buffer.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The fields of a window (for a complete list, see the definition of
struct window in window.h) include:
frameThe frame that this window is on.
mini_pNon-nil if this window is a minibuffer window.
parentInternally, Emacs arranges windows in a tree; each group of siblings has a parent window whose area includes all the siblings. This field points to a window’s parent.
Parent windows do not display buffers, and play little role in display except to shape their child windows. Emacs Lisp programs usually have no access to the parent windows; they operate on the windows at the leaves of the tree, which actually display buffers.
hchildvchildThese fields contain the window’s leftmost child and its topmost child
respectively. hchild is used if the window is subdivided
horizontally by child windows, and vchild if it is subdivided
vertically. In a live window, only one of hchild, vchild,
and buffer (q.v.) is non-nil.
nextprevThe next sibling and previous sibling of this window. next is
nil if the window is the right-most or bottom-most in its group;
prev is nil if it is the left-most or top-most in its
group.
left_colThe left-hand edge of the window, measured in columns, relative to the leftmost column in the frame (column 0).
top_lineThe top edge of the window, measured in lines, relative to the topmost line in the frame (line 0).
total_colstotal_linesThe width and height of the window, measured in columns and lines respectively. The width includes the scroll bar and fringes, and/or the separator line on the right of the window (if any).
bufferThe buffer that the window is displaying.
startA marker pointing to the position in the buffer that is the first character displayed in the window.
pointmThis is the value of point in the current buffer when this window is selected; when it is not selected, it retains its previous value.
force_startIf this flag is non-nil, it says that the window has been
scrolled explicitly by the Lisp program. This affects what the next
redisplay does if point is off the screen: instead of scrolling the
window to show the text around point, it moves point to a location that
is on the screen.
frozen_window_start_pThis field is set temporarily to 1 to indicate to redisplay that
start of this window should not be changed, even if point
gets invisible.
start_at_line_begNon-nil means current value of start was the beginning of a line
when it was chosen.
use_timeThis is the last time that the window was selected. The function
get-lru-window uses this field.
sequence_numberA unique number assigned to this window when it was created.
last_modifiedThe modiff field of the window’s buffer, as of the last time
a redisplay completed in this window.
last_overlay_modifiedThe overlay_modiff field of the window’s buffer, as of the last
time a redisplay completed in this window.
last_pointThe buffer’s value of point, as of the last time a redisplay completed in this window.
last_had_starA non-nil value means the window’s buffer was “modified” when the
window was last updated.
vertical_scroll_barThis window’s vertical scroll bar.
left_margin_colsright_margin_colsThe widths of the left and right margins in this window. A value of
nil means no margin.
left_fringe_widthright_fringe_widthThe widths of the left and right fringes in this window. A value of
nil or t means use the values of the frame.
fringes_outside_marginsA non-nil value means the fringes outside the display margins;
othersize they are between the margin and the text.
window_end_posThis is computed as z minus the buffer position of the last glyph
in the current matrix of the window. The value is only valid if
window_end_valid is not nil.
window_end_byteposThe byte position corresponding to window_end_pos.
window_end_vposThe window-relative vertical position of the line containing
window_end_pos.
window_end_validThis field is set to a non-nil value if window_end_pos is truly
valid. This is nil if nontrivial redisplay is pre-empted, since in that
case the display that window_end_pos was computed for did not get
onto the screen.
cursorA structure describing where the cursor is in this window.
last_cursorThe value of cursor as of the last redisplay that finished.
phys_cursorA structure describing where the cursor of this window physically is.
phys_cursor_typephys_cursor_heightphys_cursor_widthThe type, height, and width of the cursor that was last displayed on this window.
phys_cursor_on_pThis field is non-zero if the cursor is physically on.
cursor_off_pNon-zero means the cursor in this window is logically off. This is used for blinking the cursor.
last_cursor_off_pThis field contains the value of cursor_off_p as of the time of
the last redisplay.
must_be_updated_pThis is set to 1 during redisplay when this window must be updated.
hscrollThis is the number of columns that the display in the window is scrolled horizontally to the left. Normally, this is 0.
vscrollVertical scroll amount, in pixels. Normally, this is 0.
dedicatedNon-nil if this window is dedicated to its buffer.
display_tableThe window’s display table, or nil if none is specified for it.
update_mode_lineNon-nil means this window’s mode line needs to be updated.
base_line_numberThe line number of a certain position in the buffer, or nil.
This is used for displaying the line number of point in the mode line.
base_line_posThe position in the buffer for which the line number is known, or
nil meaning none is known. If it is a buffer, don’t display
the line number as long as the window shows that buffer.
column_number_displayedThe column number currently displayed in this window’s mode line, or nil
if column numbers are not being displayed.
current_matrixdesired_matrixGlyph matrices describing the current and desired display of this window.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The fields of a process (for a complete list, see the definition of
struct Lisp_Process in process.h) include:
nameA string, the name of the process.
commandA list containing the command arguments that were used to start this
process. For a network or serial process, it is nil if the
process is running or t if the process is stopped.
filterA function used to accept output from the process.
sentinelA function called whenever the state of the process changes.
bufferThe associated buffer of the process.
pidAn integer, the operating system’s process ID. Pseudo-processes such as network or serial connections use a value of 0.
childpA flag, t if this is really a child process. For a network or
serial connection, it is a plist based on the arguments to
make-network-process or make-serial-process.
markA marker indicating the position of the end of the last output from this process inserted into the buffer. This is often but not always the end of the buffer.
kill_without_queryIf this is non-zero, killing Emacs while this process is still running does not ask for confirmation about killing the process.
raw_statusThe raw process status, as returned by the wait system call.
statusThe process status, as process-status should return it.
tickupdate_tickIf these two fields are not equal, a change in the status of the process needs to be reported, either by running the sentinel or by inserting a message in the process buffer.
pty_flagNon-nil if communication with the subprocess uses a pty;
nil if it uses a pipe.
infdThe file descriptor for input from the process.
outfdThe file descriptor for output to the process.
tty_nameThe name of the terminal that the subprocess is using,
or nil if it is using pipes.
decode_coding_systemCoding-system for decoding the input from this process.
decoding_bufA working buffer for decoding.
decoding_carryoverSize of carryover in decoding.
encode_coding_systemCoding-system for encoding the output to this process.
encoding_bufA working buffer for encoding.
inherit_coding_system_flagFlag to set coding-system of the process buffer from the
coding system used to decode process output.
typeSymbol indicating the type of process: real, network,
serial.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here are some guidelines for use of integer types in the Emacs C source code. These guidelines sometimes give competing advice; common sense is advised.
int len = strlen
(s); unless the length of s is required for other reasons to
fit in int range.
size_t instead of ptrdiff_t, or uintptr_t instead
of intptr_t).
int for Emacs character codes, in the range 0 .. 0x3FFFFF.
ptrdiff_t for sizes, i.e., for integers bounded by the
maximum size of any individual C object or by the maximum number of
elements in any C array. This is part of Emacs’s general preference
for signed types. Using ptrdiff_t limits objects to
PTRDIFF_MAX bytes, but larger objects would cause trouble
anyway since they would break pointer subtraction, so this does not
impose an arbitrary limit.
intptr_t for internal representations of pointers, or
for integers bounded only by the number of objects that can exist at
any given time or by the total number of bytes that can be allocated.
Currently Emacs sometimes uses other types when intptr_t would
be better; fixing this is lower priority, as the code works as-is on
Emacs’s current porting targets.
EMACS_INT for representing values
converted to or from Emacs Lisp fixnums, as fixnum arithmetic is based
on EMACS_INT.
off_t, time_t). Do not assume that a system type is
signed, unless this assumption is known to be safe. For example,
although off_t is always signed, time_t need not be.
printmax_t for representing
values that might be any signed integer that can be printed,
using a printf-family function.
intmax_t for representing values that might be any
signed integer value.
bool, false and true for booleans.
Using bool can make programs easier to read and a bit faster than
using int. Although it is also OK to use int, 0
and 1, this older style is gradually being phased out. When
using bool, respect the limitations of the replacement
implementation of bool, as documented in the source file
lib/stdbool.in.h, so that Emacs remains portable to pre-C99
platforms. In particular, boolean bitfields should be of type
bool_bf, not bool, so that they work correctly even when
compiling Objective C with standard GCC.
unsigned int or signed int to
int, as int is less portable: it might be signed, and
might not be. Single-bit bit fields should be unsigned int or
bool_bf so that their values are 0 or 1.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here is a list of the more important error symbols in standard Emacs, grouped by concept. The list includes each symbol’s message and a cross reference to a description of how the error can occur.
Each error symbol has an set of parent error conditions that is a
list of symbols. Normally this list includes the error symbol itself
and the symbol error. Occasionally it includes additional
symbols, which are intermediate classifications, narrower than
error but broader than a single error symbol. For example, all
the errors in accessing files have the condition file-error. If
we do not say here that a certain error symbol has additional error
conditions, that means it has none.
As a special exception, the error symbol quit does not have the
condition error, because quitting is not considered an error.
Most of these error symbols are defined in C (mainly data.c),
but some are defined in Lisp. For example, the file userlock.el
defines the file-locked and file-supersession errors.
Several of the specialized Lisp libraries distributed with Emacs
define their own error symbols. We do not attempt to list of all
those here.
See section Errors, for an explanation of how errors are generated and handled.
errorThe message is ‘error’. See section Errors.
quitThe message is ‘Quit’. See section Quitting.
args-out-of-rangeThe message is ‘Args out of range’. This happens when trying to access an element beyond the range of a sequence, buffer, or other container-like object. See section Sequences, Arrays, and Vectors, and See section Text.
arith-errorThe message is ‘Arithmetic error’. This occurs when trying to perform integer division by zero. See section Numeric Conversions, and See section Arithmetic Operations.
beginning-of-bufferThe message is ‘Beginning of buffer’. See section Motion by Characters.
buffer-read-onlyThe message is ‘Buffer is read-only’. See section Read-Only Buffers.
circular-listThe message is ‘List contains a loop’. This happens when a circular structure is encountered. See section Read Syntax for Circular Objects.
cl-assertion-failedThe message is ‘Assertion failed’. This happens when the
cl-assert macro fails a test. See Assertions in Common Lisp
Extensions.
coding-system-errorThe message is ‘Invalid coding system’. See section Coding Systems in Lisp.
cyclic-function-indirectionThe message is ‘Symbol's chain of function indirections contains a loop’. See section Symbol Function Indirection.
cyclic-variable-indirectionThe message is ‘Symbol's chain of variable indirections contains a loop’. See section Variable Aliases.
dbus-errorThe message is ‘D-Bus error’. This is only defined if Emacs was compiled with D-Bus support. See Errors and Events in D-Bus integration in Emacs.
end-of-bufferThe message is ‘End of buffer’. See section Motion by Characters.
end-of-fileThe message is ‘End of file during parsing’. Note that this is
not a subcategory of file-error, because it pertains to the
Lisp reader, not to file I/O. See section Input Functions.
file-already-existsThis is a subcategory of file-error. See section Writing to Files.
file-date-errorThis is a subcategory of file-error. It occurs when
copy-file tries and fails to set the last-modification time of
the output file. See section Changing File Names and Attributes.
file-errorWe do not list the error-strings of this error and its subcategories,
because the error message is normally constructed from the data items
alone when the error condition file-error is present. Thus,
the error-strings are not very relevant. However, these error symbols
do have error-message properties, and if no data is provided,
the error-message property is used. See section Files.
compression-errorThis is a subcategory of file-error, which results from
problems handling a compressed file. See section How Programs Do Loading.
file-lockedThis is a subcategory of file-error. See section File Locks.
file-supersessionThis is a subcategory of file-error. See section Buffer Modification Time.
file-notify-errorThis is a subcategory of file-error. It happens, when a file
could not be watched for changes. See section Notifications on File Changes.
ftp-errorThis is a subcategory of file-error, which results from
problems in accessing a remote file using ftp. See Remote Files in The GNU Emacs Manual.
invalid-functionThe message is ‘Invalid function’. See section Symbol Function Indirection.
invalid-read-syntaxThe message is ‘Invalid read syntax’. See section Printed Representation and Read Syntax.
invalid-regexpThe message is ‘Invalid regexp’. See section Regular Expressions.
mark-inactiveThe message is ‘The mark is not active now’. See section The Mark.
no-catchThe message is ‘No catch for tag’. See section Explicit Nonlocal Exits: catch and throw.
scan-errorThe message is ‘Scan error’. This happens when certain syntax-parsing functions find invalid syntax or mismatched parentheses. See section Moving over Balanced Expressions, and See section Parsing Expressions.
search-failedThe message is ‘Search failed’. See section Searching and Matching.
setting-constantThe message is ‘Attempt to set a constant symbol’. This happens
when attempting to assign values to nil, t, and keyword
symbols. See section Variables that Never Change.
text-read-onlyThe message is ‘Text is read-only’. This is a subcategory of
buffer-read-only. See section Properties with Special Meanings.
undefined-colorThe message is ‘Undefined color’. See section Color Names.
user-errorThe message is the empty string. See section How to Signal an Error.
void-functionThe message is ‘Symbol's function definition is void’. See section Accessing Function Cell Contents.
void-variableThe message is ‘Symbol's value as variable is void’. See section Accessing Variable Values.
wrong-number-of-argumentsThe message is ‘Wrong number of arguments’. See section Classification of List Forms.
wrong-type-argumentThe message is ‘Wrong type argument’. See section Type Predicates.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In this section we list some of the more general keymaps. Many of these exist when Emacs is first started, but some are loaded only when the respective feature is accessed.
There are many other, more specialized, maps than these; in particular those associated with major and minor modes. The minibuffer uses several keymaps (see section Minibuffer Commands that Do Completion). For more details on keymaps, see section Keymaps.
2C-mode-mapA sparse keymap for subcommands of the prefix C-x 6.
See Two-Column Editing in The GNU Emacs Manual.
abbrev-mapA sparse keymap for subcommands of the prefix C-x a.
See Defining Abbrevs in The GNU Emacs Manual.
button-buffer-mapA sparse keymap useful for buffers containing buffers.
You may want to use this as a parent keymap. See section Buttons.
button-mapA sparse keymap used by buttons.
ctl-x-4-mapA sparse keymap for subcommands of the prefix C-x 4.
ctl-x-5-mapA sparse keymap for subcommands of the prefix C-x 5.
ctl-x-mapA full keymap for C-x commands.
ctl-x-r-mapA sparse keymap for subcommands of the prefix C-x r.
See Registers in The GNU Emacs Manual.
esc-mapA full keymap for ESC (or Meta) commands.
facemenu-keymapA sparse keymap used for the M-o prefix key.
function-key-mapThe parent keymap of all local-function-key-map (q.v.) instances.
global-mapThe full keymap containing default global key bindings.
Modes should not modify the Global map.
goto-mapA sparse keymap used for the M-g prefix key.
help-mapA sparse keymap for the keys following the help character C-h.
See section Help Functions.
Helper-help-mapA full keymap used by the help utility package.
It has the same keymap in its value cell and in its function cell.
input-decode-mapThe keymap for translating keypad and function keys.
If there are none, then it contains an empty sparse keymap.
See section Keymaps for Translating Sequences of Events.
key-translation-mapA keymap for translating keys. This one overrides ordinary key
bindings, unlike local-function-key-map. See section Keymaps for Translating Sequences of Events.
kmacro-keymapA sparse keymap for keys that follows the C-x C-k prefix search.
See Keyboard Macros in The GNU Emacs Manual.
local-function-key-mapThe keymap for translating key sequences to preferred alternatives.
If there are none, then it contains an empty sparse keymap.
See section Keymaps for Translating Sequences of Events.
menu-bar-file-menumenu-bar-edit-menumenu-bar-options-menuglobal-buffers-menu-mapmenu-bar-tools-menumenu-bar-help-menuThese keymaps display the main, top-level menus in the menu bar.
Some of them contain sub-menus. For example, the Edit menu contains
menu-bar-search-menu, etc. See section The Menu Bar.
minibuffer-inactive-mode-mapA full keymap used in the minibuffer when it is not active.
See Editing in the Minibuffer in The GNU Emacs Manual.
mode-line-coding-system-mapmode-line-input-method-mapmode-line-column-line-number-mode-mapThese keymaps control various areas of the mode line.
See section Mode Line Format.
mode-specific-mapThe keymap for characters following C-c. Note, this is in the
global map. This map is not actually mode-specific: its name was chosen
to be informative in C-h b (display-bindings),
where it describes the main use of the C-c prefix key.
mouse-appearance-menu-mapA sparse keymap used for the S-mouse-1 key.
mule-keymapThe global keymap used for the C-x RET prefix key.
narrow-mapA sparse keymap for subcommands of the prefix C-x n.
prog-mode-mapThe keymap used by Prog mode.
See section Basic Major Modes.
query-replace-mapmulti-query-replace-mapA sparse keymap used for responses in query-replace and related
commands; also for y-or-n-p and map-y-or-n-p. The functions
that use this map do not support prefix keys; they look up one event at a
time. multi-query-replace-map extends query-replace-map
for multi-buffer replacements. See section query-replace-map.
search-mapA sparse keymap that provides global bindings for search-related commands.
special-mode-mapThe keymap used by Special mode.
See section Basic Major Modes.
tool-bar-mapThe keymap defining the contents of the tool bar.
See section Tool bars.
universal-argument-mapA sparse keymap used while processing C-u.
See section Prefix Command Arguments.
vc-prefix-mapThe global keymap used for the C-x v prefix key.
x-alternatives-mapA sparse keymap used to map certain keys under graphical frames.
The function x-setup-function-keys uses this.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The following is a list of some hook variables that let you provide functions to be called from within Emacs on suitable occasions.
Most of these variables have names ending with ‘-hook’. They are
normal hooks, run by means of run-hooks. The value of such
a hook is a list of functions; the functions are called with no
arguments and their values are completely ignored. The recommended way
to put a new function on such a hook is to call add-hook.
See section Hooks, for more information about using hooks.
The variables whose names end in ‘-functions’ are usually abnormal hooks (some old code may also use the deprecated ‘-hooks’ suffix); their values are lists of functions, but these functions are called in a special way (they are passed arguments, or their return values are used). The variables whose names end in ‘-function’ have single functions as their values.
This is not an exhaustive list, it only covers the more general hooks.
For example, every major mode defines a hook named
‘modename-mode-hook’. The major mode command runs this
normal hook with run-mode-hooks as the very last thing it does.
See section Mode Hooks. Most minor modes have mode hooks too.
A special feature allows you to specify expressions to evaluate if and when a file is loaded (see section Hooks for Loading). That feature is not exactly a hook, but does a similar job.
activate-mark-hookdeactivate-mark-hookSee section The Mark.
after-change-functionsbefore-change-functionsfirst-change-hookSee section Change Hooks.
after-change-major-mode-hookchange-major-mode-after-body-hookSee section Mode Hooks.
after-init-hookbefore-init-hookemacs-startup-hookwindow-setup-hookSee section The Init File.
after-insert-file-functionswrite-region-annotate-functionswrite-region-post-annotation-functionSee section File Format Conversion.
after-make-frame-functionsbefore-make-frame-hookSee section Creating Frames.
after-save-hookbefore-save-hookwrite-contents-functionswrite-file-functionsSee section Saving Buffers.
after-setting-font-hookHook run after a frame’s font changes.
auto-save-hookSee section Auto-Saving.
before-hack-local-variables-hookhack-local-variables-hookSee section File Local Variables.
buffer-access-fontify-functionsSee section Lazy Computation of Text Properties.
buffer-list-update-hookHook run when the buffer list changes (see section The Buffer List).
buffer-quit-functionFunction to call to “quit” the current buffer.
change-major-mode-hookSee section Creating and Deleting Buffer-Local Bindings.
command-line-functionsSee section Command-Line Arguments.
delayed-warnings-hookThe command loop runs this soon after post-command-hook (q.v.).
focus-in-hookfocus-out-hookSee section Input Focus.
delete-frame-functionsSee section Deleting Frames.
delete-terminal-functionsSee section Multiple Terminals.
pop-up-frame-functionsplit-window-preferred-functionSee section Additional Options for Displaying Buffers.
echo-area-clear-hookSee section Echo Area Customization.
find-file-hookfind-file-not-found-functionsSee section Functions for Visiting Files.
font-lock-extend-after-change-region-functionSee section Region to Fontify after a Buffer Change.
font-lock-extend-region-functionsSee section Multiline Font Lock Constructs.
font-lock-fontify-buffer-functionfont-lock-fontify-region-functionfont-lock-mark-block-functionfont-lock-unfontify-buffer-functionfont-lock-unfontify-region-functionSee section Other Font Lock Variables.
fontification-functionsSee section Automatic Face Assignment.
frame-auto-hide-functionSee section Quitting Windows.
kill-buffer-hookkill-buffer-query-functionsSee section Killing Buffers.
kill-emacs-hookkill-emacs-query-functionsSee section Killing Emacs.
menu-bar-update-hookSee section The Menu Bar.
minibuffer-setup-hookminibuffer-exit-hookSee section Minibuffer Miscellany.
mouse-leave-buffer-hookHook run when about to switch windows with a mouse command.
mouse-position-functionSee section Mouse Position.
post-command-hookpre-command-hookSee section Command Loop Overview.
post-gc-hookSee section Garbage Collection.
post-self-insert-hookSee section Keymaps and Minor Modes.
suspend-hooksuspend-resume-hooksuspend-tty-functionsresume-tty-functionsSee section Suspending Emacs.
syntax-begin-functionsyntax-propertize-extend-region-functionssyntax-propertize-functionfont-lock-syntactic-face-functionSee section Syntactic Font Lock. See section Syntax Properties.
temp-buffer-setup-hooktemp-buffer-show-functiontemp-buffer-show-hookSee section Temporary Displays.
tty-setup-hookSee section Terminal-Specific Initialization.
window-configuration-change-hookwindow-scroll-functionswindow-size-change-functionsSee section Hooks for Window Scrolling and Changes.
window-text-change-functionsFunctions to call in redisplay when text in the window might change.
| [ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
| Jump to: | "
#
$
%
&
'
(
)
*
+
,
-
.
/
1
2
3
;
<
=
>
?
@
[
\
]
^
`
|
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z |
|---|
| Jump to: | "
#
$
%
&
'
(
)
*
+
,
-
.
/
1
2
3
;
<
=
>
?
@
[
\
]
^
`
|
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z |
|---|
| [Top] | [Contents] | [Index] | [ ? ] |
“サブ文字テーブル(sub-char-tables)”に使用される‘#^^’を目にすることがあるかもしれません。
リストの最後に要素を追加するための、これと完全に同等な方法はありません。listnameをコピーすることにより、新しいリストを作成してから、neweltをそのリストの最後に追加する、(append
listname (list
newelt))を使用することができます。すべてのCDRを辿って、終端のnilを置き換える、(nconc
listname (list
newelt))を使用することもできます。コピーも変更も行なわずに、リストの先頭に要素を追加するconsと比較してみてください。
ここでの“キー(key)”の使い方は、用語“キーシーケンス(key sequence)”とは関係ありません。キーはテーブルにあるアイテムを探すために使用される値という意味です。この場合、テーブルはalistでありalistはアイテムに関連付けられます。
S式(S-expression)、短くはsexpという言葉でも呼ばれることがありますが、わたしたちは通常、このマニュアル内ではこの用語は使用しません。
“環境”にたいするこの定義は、プログラムの結果に影響し得るすべてのデータを特に意図するものではありません。
正確に言うと、デフォルトのダイナミックスコープ(dynamic scoping)のルールでは、値セルは常にその変数のカレント値を保持しますが、レキシカルスコープ(lexical scoping)では異なります。詳細は、Scoping Rules for Variable Bindingsを参照してください。
これには、いくつか例外があります。たとえば、レキシカルバインディングは、Lispデバッガーからもアクセスできます。
MS-DOS版のEmacsは、DOSファイルシステムの制限により、かわりに_dir-locals.elという名前を使用します。
これはカリー化(currying)と関連しますが、異なる機能です。カーリングは、複数の引数をとる関数を、関数チェーンとして呼び出せるような、1つの引数を取る個々の関数に変換するような方法です。
Some elements actually supply two arguments.
Button-down is the conservative antithesis of drag.
It is required for menus which do not use a toolkit, e.g., on a text terminal.
In MS-Windows versions of Emacs compiled for the Cygwin
environment, you can use the functions
cygwin-convert-file-name-to-windows and
cygwin-convert-file-name-from-windows to convert between the
two file-name syntaxes.
An RFC, an acronym for Request for Comments, is a numbered Internet informational document describing a standard. RFCs are usually written by technical experts acting on their own initiative, and are traditionally written in a pragmatic, experience-driven manner.
This internal representation is based on one of the encodings defined by the Unicode Standard, called UTF-8, for representing any Unicode codepoint, but Emacs extends UTF-8 to represent the additional codepoints it uses for raw 8-bit bytes and characters not unified with Unicode.
The Unicode specification writes these tag names inside ‘<..>’ brackets, but the tag names in Emacs do not include the brackets; e.g., Unicode specifies ‘<small>’ where Emacs uses ‘small’.
Note that regexp-opt does not
guarantee that its result is absolutely the most efficient form
possible. A hand-tuned regular expression can sometimes be slightly
more efficient, but is almost never worth the effort.
On other systems, Emacs uses a Lisp emulation of
ls; see Contents of Directories.
For backward compatibility, you can also use a string to specify a face name; that is equivalent to a Lisp symbol with the same name.
In this context, the term font has nothing to do with Font Lock (see section Font Lock Mode).
The benefits of a Common Lisp-style package system are considered not to outweigh the costs.
| [Top] | [Contents] | [Index] | [ ? ] |
declare Formdisplay-bufferdisplay Property
| [Top] | [Contents] | [Index] | [ ? ] |
| [Top] | [Contents] | [Index] | [ ? ] |
This document was generated on February 8, 2018 using texi2any.
The buttons in the navigation panels have the following meaning:
| Button | Name | Go to | From 1.2.3 go to |
|---|---|---|---|
| [ << ] | FastBack | Beginning of this chapter or previous chapter | 1 |
| [ < ] | Back | Previous section in reading order | 1.2.2 |
| [ Up ] | Up | Up section | 1.2 |
| [ > ] | Forward | Next section in reading order | 1.2.4 |
| [ >> ] | FastForward | Next chapter | 2 |
| [Top] | Top | Cover (top) of document | |
| [Contents] | Contents | Table of contents | |
| [Index] | Index | Index | |
| [ ? ] | About | About (help) |
where the Example assumes that the current position is at Subsubsection One-Two-Three of a document of the following structure:
This document was generated on February 8, 2018 using texi2any.